On Tue, Sep 26, 2006 at 11:45:42AM -0400, Paul Jarc wrote: > mwoehlke <[EMAIL PROTECTED]> wrote: > > I am trying to figure out how to run a command and pipe the output > > through tee, and then check the status of the original command. > > This uses a bash-specific feature: > cmd > >(tee file); status=$?
This is a ksh feature that can also be found in zsh. But it's true it's not standard. I may be wrong but I don't think bash has any significant feature of its own. What is bash specific is the $PIPESTATUS array. zsh also has it but it's called $pipestatus there as zsh arrays are traditionally lowercase (so that they are not confused with scalar variables (all bash variables are both array and scalar at the same time as in ksh)). cmd | tee file and cmd exit status can be found in ${PIPESTATUS[0]}. > This should work on any sh: > exec 3>&1 && status=`exec 4>&1 && { cmd; echo $? >&4; } | tee file >&3` You may want to write it: exec 3>&1 && status=`exec 4>&1 && { cmd 4>&-; echo $? >&4; } | tee file >&3` because otherwise, if cmd spawns a process, and that process doesn't close its fd 4, you'd have to wait for it to finish (you may have the same problem if it doesn't close its fd 1 because of the pipe to tee, though). > Or, if you don't want to clobber any descriptors, in case they might > be in use for something else: [...] Then do it in a subshell (unless cmd makes use of those file descriptors) or do it this way instead of using exec (bash will take care of restoring the fds): { status=$( { { cmd 4>&- echo "$?" >&4 } 3>&- | tee file >&3 3>&- } 4>&1 ) } 3>&1 This should work in any Unix or POSIX conformant sh, not in the Bourne shell. -- Stéphane _______________________________________________ Bug-bash mailing list Bug-bash@gnu.org http://lists.gnu.org/mailman/listinfo/bug-bash