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.