Subject: Possible redirection bug in zsh 5x
From: Kynn Jones <[email-masked]>
To: [email-masked]
Date: Sun, 6 Mar 2016 12:22:12 -0500
List-Id: Zsh Workers List <zsh-workers.zsh.org>

(NB: I originally posted something very close to the message below as
a unix.stackexchange.com question, but it got no answers.  I took this
as confirmation that this may indeed be a bug.)

---

The following command produces different outputs in zsh v. 4.x and 5.x:

    {
      (
        printf "X\nY\n"
        printf "WARNING: foo\nWARNING: bar\n" >&2
        printf "1\n2\n"
      ) 2>&1 >&3 | grep -v foo >&2
    } 3>&1

(This code is supposed to illustrate how to selectively suppress some
of the output sent to stderr by a program; in this case, the warning
`foo` is being suppressed selectively, while the warning `bar` is
allowed to go through; note that in the end, `stderr` and `stdout`
streams remain separate.)

On v 4.x the output I see at the terminal is as desired/expected:

    X
    Y
    1
    2
    WARNING: bar

(You may see a different ordering of the `WARNING: bar` line relative
to the other ones.)

[NB: as pointed out in a comment to my unix.stackexchange.com
question, both bash and dash also produce the output shown above.]

On v 5.0.7 (Debian) and 5.1.1 (Darwin), however, what I see at the
terminal is this:

    X
    Y
    1
    2
    WARNING: bar
    X
    Y
    1
    2

IOW, the lines that should be sent to `stdout` appear twice.

I figure there are three possibilities:

  1. this is a bug in v. 5.x (in which case my question is: is there a
workaround?)
  2. I have not properly configured my v. 5.x zsh (in which case my
question is: how should I configure my v. 5.x zsh to get the desired
behavior?);
  3. [very unlikely, in light of the results for bash and dash] there
is a bug in v. 4.x, but not in v. 5.x, that masked a bug in my code
(in which case my question is: how could I fix my code to get the
desired behavior in v 5.x?)

Thank you in advance,

kj