Это, кажется, самая безопасная версия.
tr '[\n]' '[\0]' < a.txt | xargs -r0 /bin/bash -c 'command1 "$@"; command2 "$@";' ''
( -0
Могут быть удалены и tr
заменены редиректа (или файл может быть заменен нулем отделенный файл , а). В основном там , так как я в основном используют xargs
с find
с -print0
выходом) (Это может также иметь значение в xargs
версиях без -0
расширения)
Это безопасно, так как аргументы передают параметры в оболочку в виде массива при его выполнении. Оболочка (по крайней мере bash
) затем передаст их как неизмененный массив другим процессам, когда все будут получены с использованием["$@"][1]
Если вы используете ...| xargs -r0 -I{} bash -c 'f="{}"; command "$f";' ''
, назначение не будет выполнено, если строка содержит двойные кавычки. Это верно для каждого варианта, использующего -i
или -I
. (Из-за того, что он заменяется на строку, вы всегда можете вводить команды, вставляя неожиданные символы (например, кавычки, обратные символы или знаки доллара) во входные данные)
Если команды могут принимать только один параметр за раз:
tr '[\n]' '[\0]' < a.txt | xargs -r0 -n1 /bin/bash -c 'command1 "$@"; command2 "$@";' ''
Или с несколько меньшими процессами:
tr '[\n]' '[\0]' < a.txt | xargs -r0 /bin/bash -c 'for f in "$@"; do command1 "$f"; command2 "$f"; done;' ''
Если у вас есть GNU xargs
или другой с -P
расширением, и вы хотите запустить 32 процесса параллельно, каждый с не более чем 10 параметрами для каждой команды:
tr '[\n]' '[\0]' < a.txt | xargs -r0 -n10 -P32 /bin/bash -c 'command1 "$@"; command2 "$@";' ''
Это должно быть устойчиво к любым специальным символам на входе. (Если ввод разделен нулем.) tr
Версия получит недопустимый ввод, если некоторые строки содержат символы новой строки, но это неизбежно при использовании файла, разделенного символом новой строки.
Пустой первый параметр для bash -c
связан с этим: (со bash
страницы руководства ) (спасибо @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.