Dies scheint die sicherste Version zu sein.
tr '[\n]' '[\0]' < a.txt | xargs -r0 /bin/bash -c 'command1 "$@"; command2 "$@";' ''
( -0
kann entfernt werden und die tr
durch eine Weiterleitung ersetzt werden (oder die Datei kann stattdessen durch eine durch Null getrennte Datei ersetzt werden). Es ist hauptsächlich dort drin, da ich hauptsächlich xargs
con find
con -print0
Ausgabe) (Dies könnte auch relevant sein für xargs
Versionen ohne den -0
Verlängerung)
Dies ist sicher, da args die Parameter bei der Ausführung als Array an die Shell weitergibt. Die Shell (zumindest bash
) würde sie dann als unverändertes Array an die anderen Prozesse weitergeben, wenn alle mit ["$@"][1]
Wenn Sie ...| xargs -r0 -I{} bash -c 'f="{}"; command "$f";' ''
enthält, schlägt die Zuweisung fehl, wenn die Zeichenfolge doppelte Anführungszeichen enthält. Dies gilt für jede Variante mit -i
または -I
. (Da es in eine Zeichenkette ersetzt wird, können Sie immer Befehle einfügen, indem Sie unerwartete Zeichen (wie Anführungszeichen, Backticks oder Dollarzeichen) in die Eingabedaten einfügen)
Wenn die Befehle jeweils nur einen Parameter annehmen können:
tr '[\n]' '[\0]' < a.txt | xargs -r0 -n1 /bin/bash -c 'command1 "$@"; command2 "$@";' ''
Oder mit etwas weniger Prozessen:
tr '[\n]' '[\0]' < a.txt | xargs -r0 /bin/bash -c 'for f in "$@"; do command1 "$f"; command2 "$f"; done;' ''
Wenn Sie GNU xargs
oder eine andere mit dem -P
Erweiterung und Sie wollen 32 Prozesse parallel laufen lassen, mit nicht mehr als 10 Parametern für jeden Befehl:
tr '[\n]' '[\0]' < a.txt | xargs -r0 -n10 -P32 /bin/bash -c 'command1 "$@"; command2 "$@";' ''
Dies sollte gegen alle Sonderzeichen in der Eingabe gefeit sein. (Wenn die Eingabe durch Null getrennt ist.) Die tr
Version wird einige ungültige Eingaben erhalten, wenn einige der Zeilen Zeilenumbrüche enthalten, aber das ist bei einer durch Zeilenumbrüche getrennten Datei unvermeidlich.
Der leere erste Parameter für bash -c
ist darauf zurückzuführen: (Aus dem bash
Manpage ) (Danke @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.