Ist es möglich, die gesamte Ausgabe eines Bourne-Shell-Skripts an einen beliebigen Ort umzuleiten, aber mit Shell-Befehlen innerhalb des Skripts selbst?Wie leite ich die Ausgabe eines ganzen Shell-Skripts innerhalb des Skripts selbst um?
die Ausgabe eines einzigen Befehl Umleiten ist einfach, aber ich möchte etwas mehr wie folgt aus:
#!/bin/sh
if [ ! -t 0 ]; then
# redirect all of my output to a file here
fi
# rest of script...
Bedeutung: wenn das Skript nicht interaktiv ausgeführt wird (zum Beispiel cron), speichern Sie die Ausgabe aus von allem zu einer Datei. Wenn interaktiv von einer Shell aus ausgeführt wird, lasse die Ausgabe wie üblich auf stdout gehen.
Ich möchte dies für ein Skript tun, das normalerweise vom periodischen Dienstprogramm von FreeBSD ausgeführt wird. Es ist Teil des täglichen Laufs, den ich normalerweise nicht jeden Tag in E-Mails sehen möchte, also habe ich es nicht gesendet. Wenn jedoch etwas in diesem einen bestimmten Skript fehlschlägt, ist das wichtig für mich, 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: Joshua Antwort ist genau richtig, aber ich wollte auch stdout und stderr um das gesamte Skript speichern und wiederherzustellen, die wie dies geschehen ist:
# 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
Testen für $ TERM ist nicht der beste Weg für den interaktiven Modus zu testen. Testen Sie stattdessen, ob stdin ein tty ist (test -t 0). –
Mit anderen Worten: wenn [! -t 0]; dann exec> somefile 2> & 1; fi –
Sehen Sie hier für all die Güte: [http://tldp.org/LDP/abs/html/io-redirection.html](http://tldp.org/LDP/abs/html/io-redirection.html) Was Joshua gesagt hat. exec> Datei leitet stdout in eine bestimmte Datei um, exec
Loki