I generally put something similar to the following at the beginning of every script (especially if it’ll run as a daemon):
#!/bin/bash
exec 3>&1 4>&2
trap 'exec 2>&4 1>&3' 0 1 2 3
exec 1>log.out 2>&1
# Everything below will go to the file 'log.out':
Explanation:
-
exec 3>&1 4>&2
Saves file descriptors so they can be restored to whatever they were before redirection or used themselves to output to whatever they were before the following redirect.
-
trap 'exec 2>&4 1>&3' 0 1 2 3
Restore file descriptors for particular signals. Not generally necessary since they should be restored when the sub-shell exits.
-
exec 1>log.out 2>&1
Redirect
stdout
to filelog.out
then redirectstderr
tostdout
. Note that the order is important when you want them going to the same file.stdout
must be redirected beforestderr
is redirected tostdout
.
From then on, to see output on the console (maybe), you can simply redirect to &3
. For example,
echo "$(date) : part 1 - start" >&3
will go to wherever stdout
was directed, presumably the console, prior to executing line 3 above.