Cómo repetir variables dos veces en xargs

21

¿Cómo puedo hacer la segunda prueba de eco para hacer eco también en este ejemplo?

 echo test  | xargs -I {} echo {} && echo {}

fuente
var=test & echo $var ...
alexus
xargs -I {} var = {} echo $ var && echo $ var Eso le daría: No existe tal archivo o directorio.

Respuestas:

27

Solo escribe {}dos veces en tu comando. Lo siguiente funcionaría:

$ echo test | xargs -I {} echo {} {}
test test

Su problema es cómo se anidan los comandos . Veamos esto:

echo test | xargs -I {} echo {} && echo {}

bash se ejecutará echo test | xargs -I {} echo {}. Si se ejecuta con éxito, echo {}se ejecuta. Para cambiar la anidación, puede hacer algo como esto:

echo test | xargs -I {} sh -c "echo {} && echo {}"

Sin embargo, podría tener problemas porque el enfoque podría ser propenso a la inyección de código. Cuando "prueba" se sustituye con código de shell, se ejecuta. Por lo tanto, probablemente debería pasar la entrada al shell anidado con argumentos.

echo test | xargs -I {} sh -c 'echo "$1" && echo "$1"' sh {}
JojOatXGME
fuente
3
Tenga en cuenta que obtendrá resultados inesperados en su último código si tiene un callod ágil, literalmente $(rm -f *). Es mejor hacerloxargs -I {} sh -c 'echo "$1" && echo "$1"' sh {}
Kusalananda
@ Kusalananda, gracias. Era consciente del problema pero no podía pensar en una solución simple en ese momento. Integré tu sugerencia en la respuesta.
JojOatXGME
5

Otra opción es usar -iflag, que es lo mismo que -I{}(implica que el reemplazo se da con {}):

$ echo test | xargs -i echo {} {}
Omer Dagan
fuente
1
Mientras tanto: This option is deprecated; use -I instead.se ha agregado al manual man xargs.
Jonathan Komar
0

Para mí solo funciona la minúscula. Tenía cientos de imágenes en un directorio y quería incluirlas en una lista. La -Iopción mayúscula i no funcionó para mí. Solo las minúsculas. Probablemente debido a diferencias de versión. Todas estas imágenes tenían nombres similares Daniel_(somenumber).jpg.

Esta sintaxis ha funcionado:

ls -l | tr -s ' ' ':'| cut -d: -f9 | xargs -i echo "img src='"{}"'alt='{}'"

Devoluciones:

src='Daniel_248.jpg' alt='Daniel_248.jpg'
...

Linux ver 4.14.96-hw + # 80 SMP x86_64 GNU / Linux

Daniel Hudsky
fuente
2
Agregué un poco de formato a su respuesta para que sea más legible. Espero haberlo entendido correctamente.
fra-san