Ich möchte in der Lage sein xargs
, mehrere Parameter in verschiedenen Teilen eines Befehls auszuführen.
Zum Beispiel Folgendes:
echo {1..8} | xargs -n2 | xargs -I v1 -I v2 echo the number v1 comes before v2
Ich würde hoffen, dass es zurückkehren würde
the number 1 comes before 2
the number 3 comes before 4
... usw
Ist das erreichbar? Ich vermute, dass meine mehrfache Verwendung von -I
falsch ist.
sh
. Das Nachlaufensh
am Ende ist das, worauf gesetzt wird$0
.$0
ist normalerweise das, was den Namen des Interpreters oder des Skripts enthält.sh
mitecho $sh
dem es funktioniert. Finalsh
fungiert also als PlatzhalterIm konkreten Fall von
printf
können Sie immer Folgendes tun:weil
printf
eine intrinsischexargs
-ähnlichen Fähigkeit mehrfach auszuführen , wenn es mehr Argumente gegeben ist , als es für einen einzelnen Aufruf benötigt. Das hat aber wenig Vorteil gegenüberBei großen Listen kann der einfache
xargs
Befehl dazu führenxargs
, dass mehrere Instanzen von ausgeführt werdenprintf
, von denen einige möglicherweise eine ungerade Anzahl von Argumenten enthalten. Sie könnten zu gehen,-n 1000
um sich dagegenxargs
zu schützen, wobei 1000 eine gerade Zahl ist, die klein genug sein sollte, um die zu lange Grenze der Arg-Liste nicht zu erreichen , und groß genug, um zu vermeiden, dass so vieleprintf
s ausgeführt werden.Beachten Sie, dass bei jedem Aufruf in einem separaten neuen Prozess
xargs
nicht die integrierteprintf
, sondern die externe Shell aufgerufenprintf
wird.Beachten Sie auch, dass eine leere Eingabe, außer bei einigen BSDs, immer noch
printf
einmal ohne Argument ausgeführt wird. GNUxargs
und kompatibel haben eine-r
(oder--no-run-if-empty
) Option, um dies zu vermeiden.Um es klar auszudrücken, diese einfache Antwort ist spezifisch für Ihr
printf
Beispiel und würde in dem allgemeinen Fall nicht funktionieren, in dem Sie zwei Parameter gleichzeitig an Ihren Befehl übergeben müssen (wie dies beispielsweise der Fall wärediff
). Um das allgemeine Problem mit zu lösenzsh
, können Sie verwenden:quelle
zsh
Teil des oben Gesagten eine echte Antwort, und derxargs
Teil ohne Optionen ist nur eine Kuriosität. In einem solchen Fall würde ich in Betracht ziehen, die eigentliche Antwort an die erste Stelle zu setzen. (2) Ich gehe davon aus, dass Sie einen Grund haben, in Ihrem Befehl keine Anführungszeichen zu verwendenzsh
. Wenn ja, möchten Sie es vielleicht sagen, damit die Leute das Obige nicht lesen und anfangen zu denken, dass Zitate nicht wichtig sind. (Oder schließen Sie sie einfach ein, da sie nicht weh tun.)awk -F'\t' '/match/{printf $1"\0"$2"\0"}' | xargs -0 printf -- '-args1 "%s" -args2 "%s"' | xargs mycommand
-0
auf der erstenxargs
, um es zuverlässiger zu machen, wird dadurch besiegt, dass Sie es auf der zweiten nicht verwenden. Das erste Argument fürprintf
(sowohl das eigenständige Dienstprogramm als auchawk
dieprintf()
Funktion) ist das Format. Sie sollten dort keine Variablen verwenden. Hier könnten Sie tunawk -F'\t' '/match/{printf "-args1\0%s\0-args2\0%s\0", $1, $2}' | xargs -n400 -r0 mycommand
. Erneut-n400
erforderlich, um sicherzustellen, dassxargs
eine Reihe von Argumenten übergeben wird, die ein Vielfaches von 4 ist (beachten Sie, dass nicht alleawk
Implementierungen die Verwendung\0
dieser Argumente hier unterstützen).-0
, um es zuverlässiger zu machen, habe es verwendet, um es tun zu lassen, was ich tun wollte, was es tut.Versuche dies:
quelle
sh -c
Skript mitsh
(oder was auch immer) in auszuführen$0
. Beachten Sie, dass dies$0
nicht enthalten ist,$@
wenn dies vomsh -c
Skript verwendet werden soll, z. B. wenn das Skriptecho "the two numbers were $@"