#!/bin/bash # run a command, sending stdout to one file and stderr to another, # but also sending both to this process' stdout/stderr, respectively if [ "$3" = "" ]; then echo "usage: $0 stdout-file stderr-file cmd [args..]" exit 0 fi stdoutFile="$1" stderrFile="$2" command="$3" shift shift shift result=0 handler() { # this signal means the underlying command exit erroneously, # though we don't know the code echo "The command failed!" result=2 } trap handler SIGUSR1 # dup my stdout/err on fd 3,4 exec 3>&1 exec 4>&2 # run the command with tees to duplicate the data mypid=$$ # echo "mypid = $mypid, command=$command, args=$@, stdout=$stdoutFile, stderr=$stderrFile" (("$command" "$@" || kill -s USR1 $mypid) | tee "$stdoutFile" >&3) 2>&1 | tee "$stderrFile" >&4 exit $result