Ich versuche, mit xargs einen Befehl für jedes angegebene Argument auszuführen, aber leider scheint das Flag --replace / -I nicht richtig zu funktionieren, wenn es mit -n konjugiert wird. Es scheint, dass {} unabhängig von der Option -n in die vollständige Liste der von stdin gelesenen Argumente erweitert wird.
Leider scheinen alle Beispiele im Web Befehle zu sein (mv, cp, rm), die mehrere Argumente annehmen, wobei {} erweitert wird.
Zum Beispiel beim Ausführen:
echo a b c d | xargs -n 1 -I {} echo derp {}
Die Ausgabe ist:
derp a b c d
Aber ich habe erwartet:
derp a
derp b
derp c
derp d
Wenn Sie es jedoch ohne -I {} ausführen, erhalten Sie das erwartete Ergebnis:
echo a b c d | xargs -n 1 echo derp
derp a
derp b
derp c
derp d
Gibt es eine Möglichkeit, dies mit xargs zu erreichen? Meine ultimative Absicht ist es, damit mehrere (parralel) ssh-Sitzungen auszuführen, wie z
echo server{1..90} | xargs -n 1 -P 0 -I {} ssh {} 'echo $SOME_HOST_INFO'
Ich laufe xargs (GNU findutils) 4.4.2
auf RHEL 6.3.
xargs
, aber nicht mit GNUxargs
.man xargs
on-I
:Also, unquoted blanks do not terminate input items; instead the separator is the newline character. Implies -x and -L 1.
Es verhält sich also wie geplant.Antworten:
Sie können mit Zeilenumbrüchen wiederholen, um das erwartete Ergebnis zu erzielen. In Ihrem Fall mit der Servererweiterung wäre das:
quelle
zsh
... Meine Antwort wurde korrigiert.echo
braucht die-e
Option.Sie können ein zusätzliches Rohr wie dieses verwenden,
Die Zwischenverwendung von xargs 'echos' für jeden Buchstaben 'abcd' aufgrund der Option '-n1' einzeln. Dies setzt jeden Buchstaben in eine eigene Zeile wie folgt:
Es ist wichtig zu verstehen, dass bei Verwendung von -I (String-Ersetzung) xargs -L impliziert, das den Dienstprogrammbefehl (in Ihrem Fall echo) einmal pro Zeile ausführt. Sie können -n auch nicht mit -L verwenden, da sie sich gegenseitig ausschließen.
quelle