Me gustaría poder usar xargspara 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 -Ies incorrecto.

sh. El finalshal final es lo que se pone$0.$0suele ser lo que contiene el nombre del intérprete o el guión.shcon elecho $shque funciona. Así que lasshfunciones finales como marcador de posiciónEn el caso específico de
printf, siempre puedes hacer:porque
printftiene unaxargscapacidad 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
xargscomando simple podría resultar en laxargsejecución de varias instanciasprintf, algunas de las cuales podrían tener un número impar de argumentos. Podría pasar-n 1000paraxargsprotegerse 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 tantosprintfs.Tenga en cuenta que
xargsllamarí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
printfuna vez sin argumento. GNUxargsy 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
printfejemplo, 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
zshparte de lo anterior es una respuesta real, y la partexargssin 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 suzshcomando. 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-0en el primeroxargspara hacerlo más confiable es derrotado por no usarlo en el segundo. Además, el primer argumento paraprintf(tanto la utilidad independiente comoawklaprintf()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-n400necesario asegurarse dexargspasar una serie de argumentos que es un múltiplo de 4. (tenga en cuenta que no todas lasawkimplementaciones admiten el uso de este\0tipo aquí).-0solía hacerlo más confiable, lo usaba para que hiciera lo que quería hacer, lo que hace.prueba esto:
fuente
sh -cscript consh(o lo que sea) en$0. Tenga en cuenta que$0no se incluye$@si elsh -cguión iba a utilizarlo , por ejemplo, si el guión eraecho "the two numbers were $@"