Beispiel:
ls | echo
druckt nichts (eigentlich eine Leerzeile). Ich würde erwarten, dass es eine Liste von Dateien druckt.
ls | grep 'foo'
Funktioniert dagegen wie erwartet (druckt Dateien mit 'foo' im Namen).
Was ich in diesen Situationen mache, ist ungefähr so:
ls | while read OUT; do echo $OUT; done
aber das ist ziemlich umständlich.
Warum funktioniert Piping mit einigen Befehlen, aber nicht mit anderen? Wie kann ich dieses Problem umgehen?
ls | echo
zu tun? warum nicht einfach rennenls
?git cat-file
, aber es hat einfach nicht funktioniert. Anscheinend hat Echo das gleiche Verhalten, also habe ich es als Beispiel genommen.Antworten:
Es wird zwischen Befehlszeilenargumenten und Standardeingaben unterschieden. Eine Pipe verbindet die Standardausgabe eines Prozesses mit der Standardeingabe eines anderen. Damit
Verbindet den Standardausgang von ls mit dem Standardeingang von Echo. Gut, oder? Nun, echo ignoriert die Standardeingabe und gibt seine Befehlszeilenargumente - in diesem Fall keine für - seine eigene Standardausgabe aus. Die Ausgabe: gar nichts.
In diesem Fall gibt es einige Lösungen. Eine Möglichkeit besteht darin, einen Befehl zu verwenden, der stdin liest und stdout ausgibt, z. B. cat.
Wird "funktionieren", abhängig von Ihrer Definition der Arbeit.
Aber was ist mit dem allgemeinen Fall? Was Sie wirklich wollen, ist die Konvertierung von stdout eines Befehls in Befehlszeilenargumente eines anderen. Wie andere gesagt haben,
xargs
ist das kanonische Hilfsprogramm in diesem Fall das Lesen der Befehlszeilenargumente für einen Befehl aus der Standardeingabe und das Erstellen der auszuführenden Befehle.Sie können dies auch mit dem Substitutionsbefehl umwandeln
$()
Würde auch machen was du willst.
Diese beiden Tools sind ziemlich grundlegend für die Skripterstellung in der Shell. Sie sollten beide lernen.
Der Vollständigkeit halber ist, wie Sie in der Frage angeben, die andere grundlegende Möglichkeit, stdin in Befehlszeilenargumente zu konvertieren, der integrierte Befehl der Shell
read
. Es konvertiert "Wörter" (Wörter, wie durch dieIFS
Variable definiert ) in eine temporäre Variable, die Sie in allen Befehlsläufen verwenden können.quelle
ls | echo
druckt nur eine leere Zeile, daecho
keine Eingabe gelesen wird; Der letzte Befehl der Pipeline ist,echo
dass nichts als eine leere Zeile ausgegeben wird.Allgemein:
stellt sicher, dass der Ausgang von
a
zum Eingang von wirdb
. Ich empfehle Ihnen, denPipelines
Abschnitt von zu lesenman bash
.Wenn Sie wirklich
ls
undecho
zusammen verwenden möchten, hier einige (ziemlich nutzlose) Beispiele:quelle
Wenn Sie
echo
denls
Befehl ausführen möchten, versuchen Sie Folgendes:Dies wird
echo
mit der Ausgabe von aufrufenls
.quelle
ls | xargs -I {} echo {}
wenn Sie möchten, dass es für jede Zeile einzeln aufgerufen wirdWarum nicht einfach benutzen:
Oder viel sicherer:
quelle
echo *
.