Return codes and pipelines

Randall R Schulz rrschulz@cris.com
Mon Jan 13 10:00:00 GMT 2003


Jon,

Well, Cygwin does not include Bourne shell, it has BASH, ash and zsh, but 
it does appear that the status returned by a parenthesized pipeline under 
BASH is that of the last command in that pipeline.

Strictly speaking, that's not at odds with the first part of what I said, 
which is that the parent - child process relationship between processes in 
a pipeline is not specified.

So this leaves one puzzle: Why is it that Rolf is getting different results 
for this command between Linux and Cygwin?

     (false | true) && echo true || echo false

Rolf, which shells are you using on Linux and Cygwin?

Randall Schulz


At 20:53 2003-01-12, Jon LaBadie wrote:
>On Sun, Jan 12, 2003 at 02:21:45PM -0800, Randall R Schulz wrote:
> > Rolf,
> >
> > One posting is enough, really.
> >
> > There is no guaranteed or specified parent child relationship between the
> > processes in a pipeline. This means that you cannot predict which 
> process's
> > status will be the one returned as that of the pipeline as a whole.
>
>
> > At 14:09 2003-01-12, Rolf Campbell wrote:
> > >/home/rcampbell> (true | true) && echo true || echo false
> > >true
> > >/home/rcampbell> (true | false) && echo true || echo false
> > >false
> > >/home/rcampbell> (false | true) && echo true || echo false
> > >true
> > >/home/rcampbell> (false | false) && echo true || echo false
> > >false
> > >
> > >The third test above yields different results when run on Linux.  I'm
> > >wondering if this was the desired result or not?
>
>
>There is (or had been last I looked at the source) a defined relationship
>in the Bourne and Korn shells at least.
>
>The parent forks the last command in a pipeline which then becomes the
>parent of the other commands in the pipeline.  Thus the original parent
>only sees the last command's exit status.
>
>This scheme was done to implement the following behavior back around
>System V.2 in the great Bourne shell "rewrite in C".
>
> >From the current Solaris man page for Bourne Shell:
>
>        ...  .  Each  command  is  run  as a separate process; the
>      shell waits for the last  command  to  terminate.  The  exit
>      status  of a pipeline is the exit status of the last command
>      in the pipeline.
>
>The addition of the pipefail option to recent ksh93 versions suggests
>this relation-ship scheme has been altered in those shells.  But I
>do not think it appropriate to generically say there is no defined
>relationship as if it applies to every shell out there.
>
>--
>Jon H. LaBadie                  jcyg@jgcomp.com


--
Unsubscribe info:      http://cygwin.com/ml/#unsubscribe-simple
Bug reporting:         http://cygwin.com/bugs.html
Documentation:         http://cygwin.com/docs.html
FAQ:                   http://cygwin.com/faq/



More information about the Cygwin mailing list