Zsh Mailing List Archive
Messages sorted by:
Reverse Date,
Date,
Thread,
Author
Re: problem piping output of shell builtin
- X-seq: zsh-users 6984
- From: Pavol Juhas <juhas@xxxxxxxxxx>
- To: zsh users <zsh-users@xxxxxxxxxx>
- Subject: Re: problem piping output of shell builtin
- Date: Mon, 5 Jan 2004 20:39:39 -0500
- In-reply-to: <20040105213010.GA83099@xxxxxxxxxxxxxxxxx>
- Mail-followup-to: zsh users <zsh-users@xxxxxxxxxx>
- Mailing-list: contact zsh-users-help@xxxxxxxxxx; run by ezmlm
- References: <Pine.NEB.4.58.0401051856430.2690@xxxxxxxxxxxxxxxxxxx> <20040105203638.GA9567@xxxxxxxxxx> <20040105213010.GA83099@xxxxxxxxxxxxxxxxx>
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