Esta parece ser la versión más segura.
tr '[\n]' '[\0]' < a.txt | xargs -r0 /bin/bash -c 'command1 "$@"; command2 "$@";' ''
( -0
se puede eliminar y tr
reemplazar con una redirección (o el archivo se puede reemplazar con un archivo separado por nulos). Está principalmente allí ya que principalmente uso xargs
con find
con -print0
salida) (Esto también podría ser relevante en xargs
versiones sin la -0
extensión)
Es seguro, ya que args pasará los parámetros al shell como una matriz cuando lo ejecute. El shell (al menos bash
) los pasaría como una matriz inalterada a los otros procesos cuando todos se obtengan utilizando["$@"][1]
Si usa ...| xargs -r0 -I{} bash -c 'f="{}"; command "$f";' ''
, la asignación fallará si la cadena contiene comillas dobles. Esto es cierto para cada variante que usa -i
o -I
. (Debido a que se reemplaza en una cadena, siempre puede inyectar comandos insertando caracteres inesperados (como comillas, comillas o signos de dólar) en los datos de entrada)
Si los comandos solo pueden tomar un parámetro a la vez:
tr '[\n]' '[\0]' < a.txt | xargs -r0 -n1 /bin/bash -c 'command1 "$@"; command2 "$@";' ''
O con algo menos de procesos:
tr '[\n]' '[\0]' < a.txt | xargs -r0 /bin/bash -c 'for f in "$@"; do command1 "$f"; command2 "$f"; done;' ''
Si tienes GNU xargs
u otro con la -P
extensión y desea ejecutar 32 procesos en paralelo, cada uno con no más de 10 parámetros para cada comando:
tr '[\n]' '[\0]' < a.txt | xargs -r0 -n10 -P32 /bin/bash -c 'command1 "$@"; command2 "$@";' ''
Esto debería ser robusto contra cualquier carácter especial en la entrada. (Si la entrada está separada por un valor nulo). La tr
versión obtendrá alguna entrada no válida si algunas de las líneas contienen líneas nuevas, pero eso es inevitable con un archivo separado por líneas nuevas.
El primer parámetro en blanco para bash -c
se debe a esto: (Desde la bash
página del manual ) (Gracias @clacke)
-c If the -c option is present, then commands are read from the first non-option argument com‐
mand_string. If there are arguments after the command_string, the first argument is assigned to $0
and any remaining arguments are assigned to the positional parameters. The assignment to $0 sets
the name of the shell, which is used in warning and error messages.