Estoy tratando de usar xargs para ejecutar un comando para cada argumento proporcionado, pero desafortunadamente el indicador --replace / -I no parece funcionar correctamente cuando se conjuga con -n. Parece que {} se expandirá en la lista completa de argumentos leídos de stdin, independientemente de la opción -n.
Desafortunadamente, todos los ejemplos en la web parecen ser para comandos (mv, cp, rm) que tomarán múltiples argumentos donde se expande {}.
Por ejemplo, cuando se ejecuta:
echo a b c d | xargs -n 1 -I {} echo derp {}
El resultado es:
derp a b c d
Pero yo esperaba:
derp a
derp b
derp c
derp d
Sin embargo, ejecutarlo sin -I {} produce el resultado esperado:
echo a b c d | xargs -n 1 echo derp
derp a
derp b
derp c
derp d
¿Hay alguna manera de lograr esto con xargs? Mi intención última es usarlo para ejecutar múltiples sesiones ssh (paralelas), como
echo server{1..90} | xargs -n 1 -P 0 -I {} ssh {} 'echo $SOME_HOST_INFO'
Estoy corriendo xargs (GNU findutils) 4.4.2
en RHEL 6.3.
xargs
, pero no con GNUxargs
.man xargs
on-I
:Also, unquoted blanks do not terminate input items; instead the separator is the newline character. Implies -x and -L 1.
entonces se comporta como está diseñado.Respuestas:
Puede hacer eco con nuevas líneas para lograr el resultado esperado. En su caso con la expansión del servidor que sería:
fuente
zsh
... Se arregló mi respuesta.echo
Necesita la-e
opción.Puedes usar una tubería adicional como esta,
El uso intermedio de xargs 'echos' cada letra 'abcd' individualmente debido a la opción '-n1'. Esto pone cada letra en su propia línea como esta,
Es importante comprender que cuando se usa -I (reemplazo de cadena), xargs implica -L, que ejecuta el comando de utilidad (en su caso echo) una vez por línea. Además, no puede usar -n con -L ya que son mutuamente excluyentes.
fuente