Dies scheint die sicherste Version zu sein.
tr '[\n]' '[\0]' < a.txt | xargs -r0 /bin/bash -c 'command1 "$@"; command2 "$@";' ''
( -0Kann entfernt und die werden trmit 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 xargsmit findmit -print0Ausgang) (Dies könnte auch relevant sein , auf xargsVersionen ohne die-0 Erweiterung)
Dies ist sicher, da args die Parameter bei der Ausführung als Array an die Shell übergibt. Die Shell bashwü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 -ioder -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 xargsoder eine andere mit der -PErweiterung 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 trVersion 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 -cist folgendermaßen: (Von der bashManpage ) (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.