Me gustaría poder usar xargs
para ejecutar múltiples parámetros en diferentes partes de un comando.
Por ejemplo, lo siguiente:
echo {1..8} | xargs -n2 | xargs -I v1 -I v2 echo the number v1 comes before v2
Espero que regrese
the number 1 comes before 2
the number 3 comes before 4
... etc.
¿Es esto posible? Sospecho que mi uso múltiple de -I
es incorrecto.
sh
. El finalsh
al final es lo que se pone$0
.$0
suele ser lo que contiene el nombre del intérprete o el guión.sh
con elecho $sh
que funciona. Así que lassh
funciones finales como marcador de posiciónEn el caso específico de
printf
, siempre puedes hacer:porque
printf
tiene unaxargs
capacidad intrínseca de ejecutarse varias veces si se le dan más argumentos de los que necesita para una sola invocación. Aunque eso tiene poca ventaja sobreY para listas grandes, el
xargs
comando simple podría resultar en laxargs
ejecución de varias instanciasprintf
, algunas de las cuales podrían tener un número impar de argumentos. Podría pasar-n 1000
paraxargs
protegerse de eso, donde 1000 es un número par que debería ser lo suficientemente pequeño como para no alcanzar el límite de la lista arg demasiado largo y lo suficientemente grande como para evitar ejecutar tantosprintf
s.Tenga en cuenta que
xargs
llamaría, no a la construcción de su shellprintf
, sino a la externaprintf
, con cada invocación en un nuevo proceso separado.También tenga en cuenta que para una entrada vacía, excepto en algunos BSD, todavía se ejecutaría
printf
una vez sin argumento. GNUxargs
y compatible tienen una-r
(o--no-run-if-empty
) opción para evitar eso.Para ser claros, esta respuesta simple es específica para su
printf
ejemplo, y no funcionaría en el caso general en el que debe pasar dos parámetros a la vez a su comando (como sería el casodiff
, por ejemplo). Para resolver el problema general conzsh
, puede usar:fuente
zsh
parte de lo anterior es una respuesta real, y la partexargs
sin opciones es simplemente una rareza. En tal caso, consideraría poner primero la respuesta real. (2) Supongo que tiene una razón para no usar comillas en suzsh
comando. Si es así, puede indicarlo, para que la gente no lea lo anterior y empiece a pensar que las citas no son importantes. (O simplemente inclúyalos, ya que no duelen.)awk -F'\t' '/match/{printf $1"\0"$2"\0"}' | xargs -0 printf -- '-args1 "%s" -args2 "%s"' | xargs mycommand
-0
en el primeroxargs
para hacerlo más confiable es derrotado por no usarlo en el segundo. Además, el primer argumento paraprintf
(tanto la utilidad independiente comoawk
laprintf()
función de s ) es el formato, no debe usar variables allí. Aquí puedes hacerawk -F'\t' '/match/{printf "-args1\0%s\0-args2\0%s\0", $1, $2}' | xargs -n400 -r0 mycommand
. Una vez más, es-n400
necesario asegurarse dexargs
pasar una serie de argumentos que es un múltiplo de 4. (tenga en cuenta que no todas lasawk
implementaciones admiten el uso de este\0
tipo aquí).-0
solía hacerlo más confiable, lo usaba para que hiciera lo que quería hacer, lo que hace.prueba esto:
fuente
sh -c
script consh
(o lo que sea) en$0
. Tenga en cuenta que$0
no se incluye$@
si elsh -c
guión iba a utilizarlo , por ejemplo, si el guión eraecho "the two numbers were $@"