Subshell und stdin

18/07/2015 - 00:03 von Christian Garbs | Report spam
Mahlzeit!

Ich bin hier gerade über etwas gestolpert und verstehe nicht, warum
sich das unterschiedlich verhàlt:

$ seq 100 | ( head -n1 && tail -n1)
1

Das head scheint den gesamten stdin aufzufressen, so dass für das tail
nichts mehr übrig bleibt.

$ seq 100 > 100
$ cat 100 | ( head -n1 && tail -n1)
1

Ich weiß: Useless use of cat.
Verhàlt sich wie oben und so habe ich das auch erwartet.

$ seq 100 > 100
$ ( head -n1 && tail -n1) < 100
1
100

Hier wird zusàtzlich auch die letzte Zeile der Eingabe ausgegeben.
Aber warum nur hier und nicht auch bei den anderen beiden Varianten?

Ich hàtte ganz naiv erwartet "stdin ist stdin" und die
Eingabeumleitung der Shell sollte sich genauso wie die Pipe verhalten.

Liegt es etwa an der Pipe? Wird die beim Beenden von head vorzeitig
geschlossen, bei der Eingabeumleitung aus der Datei passiert das aber
nicht?

$ echo $SHELL
/bin/bash
$ bash --version | head -n1
GNU bash, version 4.3.11(1)-release (x86_64-pc-linux-gnu)

Gruß
Christian
Christian.Garbs.http://www.cgarbs.de
In America, any boy may become president and I suppose that's just one
of the risks he takes.
 

Lesen sie die antworten

#1 Friedhelm Waitzmann
18/07/2015 - 08:20 | Warnen spam
Christian Garbs:

Ich hàtte ganz naiv erwartet "stdin ist stdin" und die
Eingabeumleitung der Shell sollte sich genauso wie die Pipe verhalten.



Das Shell macht auch nichts anderes. Aber probiere mal statt
( head -n1 && tail -n1 )

( stat - ; head -n1 && echo Und jetzt der Rest: && cat )

Liegt es etwa an der Pipe? Wird die beim Beenden von head vorzeitig
geschlossen, bei der Eingabeumleitung aus der Datei passiert das aber
nicht?



Nein. Das Subshell, das nach dem erfolgreich beendeten head dem
Operator && gemàß tail startet, gibt seinen offenen Kanal stdin
einfach sowohl an head als auch danach an tail weiter. Wenn head
– spàtestens dann, wenn es endet – seine Standardeingabe
schließt, hat das Subshell, das head gestartet hat, diesen Kanal
weiterhin offen, um ihn an tail weiterzugeben. Im
Betriebssystemkern àndert sich also nichts, außer, dass die Anzahl von
Prozessen, die diesen Kanal offen haben, von 2 auf 1 verringert
und dann nochmal auf 2 erhöht wird. Solange diese Anzahl größer
als 0 bleibt, àndert sich an der Offenheit des Kanals nichts.

Ich vermute, dass head ein Pipe als Standardeingabe anders
behandelt als eine Datei als Standardeingabe.


Friedhelm

Ähnliche fragen