Ist es möglich, die gesamte Ausgabe eines Bourne-Shell-Skripts an einen anderen Ort umzuleiten, jedoch mit Shell-Befehlen im Skript selbst?
Das Umleiten der Ausgabe eines einzelnen Befehls ist einfach, aber ich möchte mehr davon:
#!/bin/sh
if [ ! -t 0 ]; then
# redirect all of my output to a file here
fi
# rest of script...
Das heißt: Wenn das Skript nicht interaktiv ausgeführt wird (z. B. cron), speichern Sie die Ausgabe von allem in einer Datei. Wenn Sie interaktiv von einer Shell aus ausführen, lassen Sie die Ausgabe wie gewohnt auf stdout gehen.
Ich möchte dies für ein Skript tun, das normalerweise vom periodischen Dienstprogramm FreeBSD ausgeführt wird. Es ist Teil des täglichen Laufs, den ich normalerweise nicht jeden Tag per E-Mail sehen möchte, daher habe ich ihn nicht gesendet. Wenn jedoch etwas in diesem einen bestimmten Skript fehlschlägt, ist das für mich wichtig und ich möchte in der Lage sein, die Ausgabe dieses einen Teils der täglichen Jobs zu erfassen und per E-Mail zu versenden.
Update: Joshuas Antwort ist genau richtig, aber ich wollte auch stdout und stderr für das gesamte Skript speichern und wiederherstellen, was folgendermaßen gemacht wird:
# save stdout and stderr to file descriptors 3 and 4, then redirect them to "foo"
exec 3>&1 4>&2 >foo 2>&1
# ...
# restore stdout and stderr
exec 1>&3 2>&4
exec 1>&3 2>&4 3>&- 4>&-