Path: utzoo!utgpu!news-server.csri.toronto.edu!rpi!zaphod.mps.ohio-state.edu!pacific.mps.ohio-state.edu!linac!convex!newsadm From: tchrist@convex.COM (Tom Christiansen) Newsgroups: comp.unix.shell Subject: Re: I/O Redirection question Message-ID: <1991Apr17.174220.8859@convex.com> Date: 17 Apr 91 17:42:20 GMT References: <1991Apr11.144844.28800@riacs.edu> Sender: newsadm@convex.com (news access account) Reply-To: tchrist@convex.COM (Tom Christiansen) Organization: CONVEX Software Development, Richardson, TX Lines: 54 Nntp-Posting-Host: pixel.convex.com From the keyboard of browning@nas.nasa.gov (David S. Browning): :I have a related question. Is it possible, in csh, to redirect stdout :and stderr to different files? % (cmd > file.stdout) >& file.stderr :Or to redirect stderr and not stdout? :I know how to do it in sh/ksh, but not in csh. No, that's not generally feasible, although if stdout is a tty, you can redirect it to /dev/tty. The True Shell solution of doing something to stderr and leaving stdout alone can't be done in csh. Consider this: cmd 2>file.stderr cannot be done in the csh in a general way. And let's say you want to pipe stderr through a filter, leaving stdout inviolate. It's even more impossible, although the True Shell does take a bit of staring at to get used to. $ 3>&1 (command_1 2>&1 1>&3 3>&- | command_2 3>&-) More interesting contortions are also feasible. Let's say I want to run dd, send its stderr through a filter to throw out anticipated, leave its stdout all alone, and have the whole thing return not the status from the filter, but from dd. In csh, you're so out of luck it's pitiful. In a true shell, this works (believe it or not :-): #!/bin/sh dd_noise='^[0-9]+\+[0-9]+ records (in|out)$' exec 3>&1 status=`((dd if=/dev/rmt20 bs=64k 2>&1 1>&3 3>&- 4>&-; echo $? >&4) | egrep -v "$dd_noise" 1>&2 3>&- 4>&-) 4>&1` exit $status # or test and branch You could call this "clean_dd" and use it this way: clean_dd > file || (echo dd error; exit 2) And still normal stderr stuff where you want it. Three notes: 1) The variable assignment is to make sure my special characters in the regexp survive the backticks. 2) I could never have done this without Maarten Litmath's help. 3) By ``True Shell'', I mean one that lets you manipulate fd's as variables, pipe built-ins (like while) into commands, etc. --tom