noqqe » blog | sammelsurium | photos | projects | about

Gestern hat mich eine Idee für ein Skript beschäftigt. Im Detail wollte ich die Syntax:

cat any_file.txt | script.sh

abbilden. Lesen von File Descriptor 0. Also Standard-Input. Mich beschäftigte das Thema aber länger, als ich es erwartet hatte. Auf Sinn und Unsinn des Skripts möchte zumindest in diesem Blogpost nicht weiter eingehen ;)

Versuche

Nach kurzem bemühen einer Suchmaschine fand ich heraus, dass /dev/stdin das magische Schlüsselwort der Sache ist. Wie also von Standard Input lesen?

cat /dev/stdin
cat /dev/stdin > /tmp/foobar

War in etwa mein erster Ansatz. Mich wunderte extrem, dass der übergebene Inhalt zwar ausgegeben wird, aber nicht in dem File steht. Erkenntnis daraus: File Descriptor 0 lässt sich anscheinend nur einmal auslesen. Zweiter Versuch:

INPUT=$(cat /dev/stdin)

Schliesslich wollte ich den Input auch im Script weiter verarbeiten. Erwies sich aber auch als ungünstig, da Zeilenumbrüche in Variablen irgendwie verschluckt werden.

Lösung

Anstatt hier weiterhin mit erfolglosen Lösungsansätzen herum zu schmeissen:

cat < /dev/stdin >> /tmp/foobar

Sieht unlogisch aus, funktioniert aber besser als alle Anderen.

/dev/stdin und read

Ich habe es nicht geschafft, nach dem einlesen von /dev/stdin eine bedienbare

read irgendeinevariable

Operation durchzuführen. Alle Eingaben werden automatisch mit dem Inhalt von /dev/stdin gefüllt. Ich konnte dafür leider noch keine Lösung finden.

Comments (3)

vain on 2010-12-11T23:57:02
Hey, du kannst auch explizit das Terminal nochmal öffnen mit /dev/tty. Kann zum Beispiel so aussehen: (read -p 'Gib ein: ' -r line < /dev/tty; echo "$line") hurz cat hurz Cheers! PS.: War dein Blog nicht mal im UbuntuUsers-Planeten? Oder kommt da nur nichts mehr an?

vain on 2010-12-12T00:00:02
Huch, da ging irgendwie die Hälfte verloren. Ich weiß mir grade nicht anders zu helfen, also: https://gist.github.com/737572 ;)

noqqe on 2010-12-12T14:05:36
Oh das ist auch eine sehr gute Idee :) Ja mein Blog ist auch immernoch im Ubuntuusers Planeten. Aber ich finde im Moment nicht die nötige Relevanz in meinen Posts um diese dort zu posten :)