Pipes und wie man sie in bash verwendet

In einigen Skripten werden solche Befehle angezeigt: /bin/cat somefile | someprogram. Ich würde gerne wissen, wie man die gesamte Pipe genauso liest wie ein Programm. Wenn ich also /bin/cat something | myprogram.sh ausführe, hat myprogram.sh eine Variable namens mypipevar, die dem entspricht, was weitergeleitet wurde – dem gesamten Pipe-Text. Wenn dies unklar ist, lassen Sie es mich bitte wissen. Ich habe gelesen, dass das Lesen wahrscheinlich nicht funktioniert und Bash möglicherweise nicht die richtige Shell ist.

Antwort

Die Pipe verbindet stdout eines Programms zu stdin eines anderen, lesen Sie in Ihrem Skript einfach von stdin und Sie erhalten, was der vorherige Befehl ausgedruckt hat. Eine einfache Möglichkeit, dies in eine Variable einzulesen, ist mit cat beispielsweise innerhalb von myprogram.sh:

mypipevar="$(cat ${1:-/dev/stdin})" echo "Obtained the value: "$mypipevar"" 

Allerdings recht Oft möchten Sie Dinge Zeile für Zeile anstatt auf einmal verarbeiten. Dies kann mit

while read line do echo "$line" done < "${1:-/dev/stdin}" 

erfolgen. Beachten Sie, dass ${1:-/dev/stdin} gibt Ihnen das erste Argument, oder wenn keine Argumente angegeben sind, dann /dev/stdin, das den Inhalt von stdin enthält, der wie eine Datei gelesen werden kann. Auf diese Weise können Sie das Skript entweder als command | script oder einfach als script filename ausführen.

Schreibe einen Kommentar

Deine E-Mail-Adresse wird nicht veröffentlicht. Erforderliche Felder sind mit * markiert.