On 2011-05-28 10:14 +0200, Rick Thomas wrote: > Can anybody explain this difference between the behavior of bash and > ksh?
It depends on whether the shell starts a subshell for (compound) commands in pipelines. > When reading the man page, I would expect both of them to have the > behavior exhibited by ksh. > Why does bash seem to treat "return" like a single level "break" in > this context? > > The "echo "$AA" | while read" is important context. If I change it to > "for i in 0 1", return does as expected. Actually, the pipeline is the most important. You can achieve the same with a simpler script: --8<---------------cut here---------------start------------->8--- strange () { for j in 0 1 2 3 do : | { echo 1;return; } done } echo $(strange) --8<---------------cut here---------------end--------------->8--- > I wonder if it has anything to do with "while read" causing a subshell > to be created, Not exactly, it's the pipeline that causes creation of the subshell. > and bash getting confused about the "return" inside of > a subshell. It does not get confused; as you can see, the subshell properly returns. > If so, it's a bug in bash that ksh gets right, so it > ought to be fixable. There is no wrong or right here, since the susv3 specification is rather vague: ,---- | Additionally, each command of a multi-command pipeline is in a subshell | environment; as an extension, however, any or all commands in a pipeline | may be executed in the current environment. `---- So bash implements the default, while ksh implements the extension. Having an option in bash to control the behavior would be nice, however. See also the following blog entry: http://backreference.org/2010/10/23/on-pipes-subshells-and-descriptors/. Sven -- To UNSUBSCRIBE, email to debian-user-requ...@lists.debian.org with a subject of "unsubscribe". Trouble? Contact listmas...@lists.debian.org Archive: http://lists.debian.org/87fwnzjc0s....@turtle.gmx.de