Wann verwendet man xargs, wenn Rohrleitungen?
Ich bin neu in bash und ich bin versucht, zu verstehen, die Verwendung von xargs
, die ist immer noch nicht klar für mich. Zum Beispiel:
history | grep ls
Hier bin ich auf der Suche für den Befehl ls
in meiner Geschichte. In diesem Befehl, ich habe nicht mit xargs
und es funktionierte gut.
find /etc - name "*.txt" | xargs ls -l
Ich diese, ich hatte zu verwenden xargs
aber ich kann immer noch nicht verstehen den Unterschied und ich bin nicht in der Lage zu entscheiden, richtig zu verwenden wenn xargs
ist und Wann nicht.
- Die bottom line ist, gibt es ein limit für die Größe des command-line-Befehle. (es ist eine harte Zahl in der Regel
128KiB
) finden Sie unter Was definiert die maximale Größe für einen Befehl einziges argument?. Wenn Ihr den Befehl Linie überschreitet, die Größe, Ihre alternative ist die Verwendungxargs
die Pause, und den Befehl verarbeiten für Sie.
Du musst angemeldet sein, um einen Kommentar abzugeben.
Deine Frage zu beantworten:
xargs
kann verwendet werden, wenn Sie brauchen, um die Ausgabe von einem Befehl und verwenden Sie es als ein argument an ein anderes. In deinem ersten Beispielgrep
nimmt die Daten von der Standardeingabe, statt Sie als ein argument. Alsoxargs
ist nicht erforderlich.xargs
nimmt die Daten von der standard-Eingabe und führt einen Befehl aus. Standardmäßig werden die Daten angehängt, um das Ende des Befehls als argument. Es kann eingefügt werden, überall jedoch, mit einem Platzhalter für die Eingabe. Die traditionellen Platzhalter ist{}
; mit diesem, deinem Beispiel-Befehl könnte dann wie folgt geschrieben werden:Wenn du 3 text-Dateien in
/etc
erhalten Sie eine vollständige Liste von Verzeichnissen jede. Natürlich könnte man einfach haben, einfach geschriebenls -l /etc/*.txt
gespeichert und die Mühe.Weiteres Beispiel können Sie benennen Sie diese Dateien, und erfordert die Platzhalter
{}
zu zweimal verwendet werden.Beides sind schlechte Beispiele, und wird brechen, sobald Sie haben einen Dateinamen mit Leerzeichen. Sie können das umgehen, indem Sie sagen
find
zu trennen Dateinamen mit einem null-Zeichen.Meine persönliche Meinung ist, dass es fast immer alternativen zur Verwendung
xargs
, und Sie werden besser gedient werden, durch das erlernen dieser.Kurze Antwort: Vermeiden Sie
xargs
für jetzt. Zurück zuxargs
wenn Sie geschrieben haben, Dutzende oder Hunderte von Skripten.Befehle können Sie Ihre Eingabe von Parametern (wie
rm bad_example
) oder bekommen können, die Eingabe vonstdin
(und nicht nur das y auf die Frage nachrm -i is_this_bad_too
, aber auchread answer
). Andere Befehle wiegrep
undsed
Aussehen wird für die Parameter und die Parameter zeigen nicht den input-Schalter auf den Eingang.Ihre
grep
Beispiel funktioniert das Lesen von stdin, nichts besonderes benötigt.Ihre
ls
muss die Ausgabe als parameter.xargs
ist nur eine Möglichkeit, die Dinge umzudrehen. Verwendenman xargs
für mehr über xargs. Alternativen:Zuerst versuchen, um zu sehen, welche dieser Befehle ist am besten, wenn Sie
a nasty filename with spaces.txt
im /etc.xargs(1) ist gefährlich (gebrochen, ausgenutzt werden, etc.) wenn Lesen nicht-NUL-getrennte Eingabe.
Wenn Sie mit Dateinamen, verwenden Sie
find
's -exec [Befehl] {} + statt.Wenn man NUL-getrennte Ausgabe verwenden
xargs -0
.-print0
zu den cmd-line. Überprüfen Sie die man-Seite. (die meisten neuen Versionen haben)GNU Parallel das gleiche tun können wie xargs, aber nicht die gebrochen und ausgenutzt "features".
Können Sie lernen, GNU Parallel anhand von Beispielen http://www.gnu.org/software/parallel/man.html#EXAMPLE:-Working-as-xargs--n1.-Argument-appending und zu Fuß durch das tutorial http://www.gnu.org/software/parallel/parallel_tutorial.html
Wenn Sie Rohrleitungen ohne
xargs
, die eigentlichen Daten werden in den nächsten Befehl. Auf der anderen Seite, bei der Verwendung von Rohrleitungen mitxargs
werden die tatsächlichen Daten von der Ansicht als parameter für den nächsten Befehl. Ein konkretes Beispiel, sagen, Sie haben einen Ordner mita.txt
undb.txt
.a.txt
enthält nur eine einzige Zeile 'Hallo Welt!', undb.txt
ist einfach leer.Wenn Sie
Würden Sie am Ende immer die Ausgabe.
Doch, wenn Sie
Würden Sie nichts bekommen, da weder Datei a.txt noch b.txt enthält das Wort txt. Wenn der Befehl
Würden Sie bekommen
Weil mit
xargs
die beiden Dateinamen gegeben durchls
übergebengrep
als Argumente, sondern als der eigentliche Inhalt.