Dies scheint die sicherste Version zu sein.
tr '[\n]' '[\0]' < a.txt | xargs -r0 /bin/bash -c 'command1 "$@"; command2 "$@";' ''
( -0
Kann entfernt und die werden tr
mit einer Umleitung ersetzt (oder die Datei kann mit einem Null - separierte Datei stattdessen ersetzt werden). Es ist vor allem dort , da ich hauptsächlich Verwendung xargs
mit find
mit -print0
Ausgang) (Dies könnte auch relevant sein , auf xargs
Versionen ohne die-0
Erweiterung)
Dies ist sicher, da args die Parameter bei der Ausführung als Array an die Shell übergibt. Die Shell bash
würde sie dann (zumindest ) als unverändertes Array an die anderen Prozesse übergeben, wenn alle unter Verwendung von erhalten werden["$@"][1]
Wenn Sie verwenden ...| xargs -r0 -I{} bash -c 'f="{}"; command "$f";' ''
, schlägt die Zuweisung fehl, wenn die Zeichenfolge doppelte Anführungszeichen enthält. Dies gilt für jede Variante mit -i
oder -I
. (Da es in eine Zeichenfolge ersetzt wird, können Sie jederzeit 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 der -P
Erweiterung haben und 32 Prozesse parallel ausführen möchten, mit jeweils 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über Sonderzeichen in der Eingabe robust sein. (Wenn die Eingabe durch Null getrennt ist.) Die tr
Version erhält eine ungültige Eingabe, wenn einige der Zeilen Zeilenumbrüche enthalten. Dies ist jedoch bei einer durch Zeilenumbrüche getrennten Datei unvermeidbar.
Der leere erste Parameter für bash -c
ist folgendermaßen: (Von der 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.