Zsh Mailing List Archive
Messages sorted by: Reverse Date, Date, Thread, Author

Re: problem piping output of shell builtin



On Mon, Jan 05, 2004 at 03:30:10PM -0600, Vincent Stemen wrote:
> On Mon, Jan 05, 2004 at 03:36:38PM -0500, Pavol Juhas wrote:
> > On Mon, Jan 05, 2004 at 07:26:15PM +0000, gj@xxxxxxxxxxxxxxxx wrote:
...
> > > Why can't I pipe the output of 'jobs' thusly?
> > 
> > AFAIK, all the shells run one side of the pipe in a subshell.  bash
> > executes subshell for the right side of the pipe, however zsh does
> > so for the left side.  Therefore the `jobs' command in 
> > `jobs|read line' is evaluated in the subshell of zsh, which has no
> > knowledge about processes in the parent shell - and produces no
> > output.  Left side subshell is however advantageous in other
> > situations, just compare
> > 
> >   zsh -c 'echo 10|read a; echo .$a'
> >   .10
> >   bash -c 'echo 10|read a; echo .$a' 
> >   .
...
> 
> Under bash, at least, the semi-colon is ending the pipe command and
> then executing "echo .$a" as new command in the original shell.  So
> you need to group the entire right side in the above example.
> ie.
> 
> $ echo 10 | (read a; echo .$a)
> .10
> $

Exactly, bash has no way to read the output of the pipe to a
variable (well, without creating temporary file).

> 
> That is interesting.  I did not know zsh did that by default.
> However, I am not sure you are correct about zsh forking a sub-shell
> for the left side of the pipe.  If so, then local shell variables from
> the parent shell should not be accessible unless they are exported,
> but they are.
> 
> $ x=foo 
> $ echo $x | read a; echo .$a
> .foo
> $

Variables are exported to the subshell, but if you change them in
the left-side of the pipe, they will keep the original value in the
parent shell, e.g.

  $ a=foo; { a=bar } | :
  $ echo $a
  foo

  $ a=foo; { a=bar }
  $ echo $a
  bar

  $ a=foo; : | { a=bar }
  $ echo $a
  bar

  $ i=foo; for i in 1 2; do echo $i; done | cat; echo $i
  1
  2
  foo

I think the most recent versions of zsh were expanded so they
actually can handle `jobs|read line'.

Pavol



Messages sorted by: Reverse Date, Date, Thread, Author