summaryrefslogtreecommitdiff
path: root/cil/bin/teetwo
blob: 2aa68fa5ea1034a40d7dba652d433f21405a1d24 (plain)
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
#!/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