[buug] loops and pipe sinks are subshells, aaaargh

Ian Zimmerman itz at buug.org
Thu Aug 4 14:07:14 PDT 2011

> [34]matica:~$ echo bar > baz
> [35]matica:~$ foo=1
> [36]matica:~$ cat baz | while read line ; do foo=$line ; done
> [37]matica:~$ echo $foo
> 1

Tony> Well, a pipe does need two processes so you can have concurrent
Tony> execution, otherwise you'd have a MSDOS-style pipe

But bash creates 3 processes in this case.  There is a subshell where
the while .. done executes.  And I'm sure this is mandated by POSIX.

Anyway, as I wrote I'm just interested in solutions :-P Right now I use
temporary files which is ugly as sin.

Ian Zimmerman
gpg public key: 1024D/C6FF61AD
fingerprint: 66DC D68F 5C1B 4D71 2EE5  BD03 8A00 786C C6FF 61AD
Rule 420: All persons more than eight miles high to leave the court.

More information about the buug mailing list