Es wird zwischen Befehlszeilenargumenten und Standardeingabe unterschieden. Eine Pipe verbindet die Standardausgabe eines Prozesses mit der Standardeingabe eines anderen. Also
ls | echo
Verbindet die Standardausgabe von ls mit der Standardeingabe von echo. Gut, oder? Nun, echo ignoriert die Standardeingabe und gibt seine Kommandozeilenargumente - die in diesem Fall keine sind - in sein eigenes stdout aus. Die Ausgabe: gar nichts.
In diesem Fall gibt es ein paar Lösungen. Eine ist, einen Befehl zu verwenden, der stdin liest und nach stdout ausgibt, wie z. B. cat.
ls | cat
Wird “funktionieren”, je nachdem, was Ihre Definition von Arbeit ist.
Aber was ist mit dem allgemeinen Fall. Was Sie wirklich wollen, ist, stdout eines Befehls in Kommandozeilen-Args eines anderen zu konvertieren. Wie andere schon gesagt haben, ist xargs
in diesem Fall das kanonische Hilfswerkzeug, das die Kommandozeilen-Args für einen Befehl aus dessen stdin liest und die auszuführenden Befehle konstruiert.
ls | xargs echo
Sie könnten dies auch etwas umwandeln, indem Sie den Ersetzungsbefehl $()
echo $(ls)
verwenden, der auch das tun würde, was Sie wollen.
Diese beiden Werkzeuge sind ziemlich zentral für das Shell-Scripting, Sie sollten beide lernen.
Der Vollständigkeit halber: Wie Sie in der Frage andeuten, ist die andere grundlegende Möglichkeit, stdin in Kommandozeilen-Args zu konvertieren, der in der Shell eingebaute Befehl read
. Er konvertiert “words” (Wörter, wie sie durch die Variable IFS
definiert sind) in eine temp-Variable, die Sie in beliebigen Befehlsläufen verwenden können.