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

Bug report + feature request



I have found a bug in zsh.  I've got access to:
   zsh 3.1.5  on Solaris 2.6
   zsh 3.1.9  on Solaris 8, redhat 6.2, irix 6.5
and each of these suffers from the problem.

Basically, I want to switch STDOUT and STDERR so I pipe STDERR to some
other commands.  The following lines show what's happening to prevent me
from doing this (though I can do it in sh/ksh distributed with Solaris).

   echo '=1 ====='
   echo
   ls -l /tmp/z   | while read line ;do echo ":: "$line; done
   echo
   echo '=2 ====='
   echo
   ls -l /tmp/z/a | while read line ;do echo ":: "$line; done
   echo
   echo '=3 ====='
   echo
   ls -l /tmp/z   3>&1 1>&2 2>&3 | while read line ;do echo ":: "$line; done
   echo
   echo '=4 ====='
   echo
   ls -l /tmp/z/a 3>&1 1>&2 2>&3 | while read line ;do echo ":: "$line; done

produce

   =1 =====
   
   :: total 16
   :: -rw-r--r--   1 sbeck    apps         396 Oct  5 13:44 foo
   
   =2 =====
   
   /tmp/z/a: No such file or directory
   
   =3 =====
   
   total 16
   -rw-r--r--   1 sbeck    apps         396 Oct  5 13:44 foo
   :: total 16
   :: -rw-r--r--   1 sbeck    apps         396 Oct  5 13:44 foo
   
   =4 =====
   
   :: /tmp/z/a: No such file or directory

Notice that in the 3rd section, the output from the command ends up on
both STDOUT and STDERR.  All other shells (ksh, sh, bash) that I tested
give the correct output for the 3rd case:

   total 16
   -rw-r--r--   1 sbeck    apps         396 Oct  5 13:44 foo



Now for the feature request.  Since I'd actually like to separate and
pipe STDOUT and STDERR separately to different commands (all of the
above came about from various attempts to get this working) without
resorting to fifos, intermediate files, etc., what I'd _really_ like to
do is to be able to pipe different file descriptors similar to how I can
redirect them to a file.  For example, I'd like to replace the following
lines:

  COMMAND > /tmp/stdout 2> /tmp/stderr
  cat /tmp/stderr | STDERR_COMMAND
  cat /tmp/stdout | STDOUT_COMMAND

with the single line:

  COMMAND >| STDOUT_COMMAND 2>| STDERR_COMMAND

If this syntax isn't acceptable, that's fine with me.  Any syntax is
fine.  I'd just like the functionality.



Please reply to me as well as the list since I'm not currently subscribed
to this list.


--------------------------|  Sullivan Beck  |---------------------------
mailto:sbeck@xxxxxxxxxxxx          |            Senior System Programmer
http://www.cise.ufl.edu/~sbeck     |               University of Florida
PH : (352) 392-1057                |                     CISE Department
Fax: (352) 392-1220                |                            CSE 314E
------------------------------------------------------------------------



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