On Wed, Aug 08, 2001 at 05:49:15PM +0200, Eric Schaefer wrote:
echo BBB | (echo AAA ; cat)
[1]
echo BBB | echo AAA ; cat
[2]
echo BBB | (cat ; cat)
[3]
gibt das erste cat die BBB aus.
Im Fall [2] werden zwei separate Prozesse ausgeführt, die nix miteinander zu tun haben, nämlich "echo BBB | echo AAA" und "cat". Die Pipe verbindet stdout von "echo BBB" mit stdin von "echo AAA".
Yepp, der Fall war mir klar.
Im Fall [1] wird stdout von "echo BBB" erst mit "echo AAA" und dann mit "cat" verbunden (eigentlich werden die sie vom Vaterprozeß erben [siehe "double fork"]). Wenn aber im Fall [3] in der Klammer zwei "cat" stehen, dann ist beim zweiten cat die Pipe schon leer.
MMh. Bevor die subshell per exec startet, wird also der stdin auf die pipe verbogen. Die beiden Kommandos der Subshell erben dann diesen stdin. Thx, ich habe es kapiert. Subshells haben in unserer Eigenbaushell damals irgendwie gefehlt :)
Reinhard