Zsh Mailing List Archive
Messages sorted by:
Multios again (Re: Piping stderr (was Re: Two bug reports))
- X-seq: zsh-workers 16887
- From: "Bart Schaefer" <schaefer@xxxxxxxxxxxxxxxx>
- To: Zsh hackers list <zsh-workers@xxxxxxxxxx>
- Subject: Multios again (Re: Piping stderr (was Re: Two bug reports))
- Date: Sat, 23 Mar 2002 23:47:18 +0000
- In-reply-to: <1020323224514.ZM29171@xxxxxxxxxxxxxxxxxxxxxxx>
- Mailing-list: contact zsh-workers-help@xxxxxxxxxx; run by ezmlm
- References: <Pine.LNX.4.33L2.0203231307490.19000-100000@xxxxxxxxxxxxxxx> <1020323224514.ZM29171@xxxxxxxxxxxxxxxxxxxxxxx>
On Mar 23, 10:45pm, Bart Schaefer wrote:
} The same problem with MULTIOS occurs with `3>&2 2>&1 1>&3 |'.
Given that we have the >(...) syntax, I'm wondering there should be a way
to allow multios for redirections but not for pipes. That would mean that
in `command >file1 >file2 | prog', file1 and file2 would get output but the
pipe would get nothing. That way, `command 2>&1 >file | prog' would work
the way it does in other shells, and if you really mean for `prog' to get
a copy of the input you can write `command 2>&1 >file >>(prog)' instead.
It further would mean that `command 2>>(prog1) >file | prog2' would send
ONLY the output of `prog1' through `prog2', which seems to be partly what
Wayne was getting at with his question.
Various weird tidbits while I'm on the subject:
Using `1>&1' creates some pretty strange effects; it duplicates stdout
2**N times (where N is the number of uses of `1>&1'). Let's look at a few
examples; the first two just set up the context.
zsh% (print -u2 foo; print bar) >>(tr a-z A-Z)
We know that the >(...) runs asynchronously, so that's fine.
zsh% (print -u2 foo; print bar) >>(tr a-z A-Z) | wc
2 2 8
Shows that the stdout of the >(...) expression also goes to the pipe. That
implies a simple way to make >(...) act semi-synchronously: pipe the whole
command to `cat'.
Now for the strange stuff:
zsh% (print -u2 foo; print bar) 1>&1 >>(tr a-z A-Z) | cat
So `cat' got two copies of the original stdout and >(...) got one. Yet:
zsh% (print -u2 foo; print bar) >>(tr a-z A-Z) 1>&1 | cat
Here, 1>&1 duplicated the input to >(...) as well as to the pipe. At first
I thought it had somehow duplicated the output of >(...), but:
zsh% (print -u2 foo; print bar) 2>>(tr a-z A-Z) 1>&1 | cat
Now for the real silliness:
zsh% (print -u2 foo; print bar) 1>&1 >>(tr a-z A-Z) 1>&1 | cat
Can this really be the way it's supposed to work?
Bart Schaefer Brass Lantern Enterprises
Zsh: http://www.zsh.org | PHPerl Project: http://phperl.sourceforge.net
Messages sorted by: