Ich habe das oben in meiner Bash-Skriptdatei gesehen:
export LOGFILE=$LOGDIRECTORY/${SCRIPT_NAME}.log
exec > >(tee $LOGFILE)
exec 2>&1
Was tut es? Was machen zwei exec-Prozesse hier? Mir ist klar, dass, wenn ich es so halte, die gesamte Ausgabe der Ausführung des Skripts weitergeleitet wird, $LOGFILE
aber ich wollte es aus der Perspektive der exec
Anweisungen verstehen .
exec
Zeilen könnten durchaus nur eine (exec > >(tee "$LOGFILE") 2>&1
) sein.Antworten:
Führt in Shells
exec
1) Dateiöffnungen und -umleitungen aus 2) dasexec
Aktualisieren (Ersetzen des aktuellen Prozessabbilds durch ein anderes Prozessabbild).Dies
exec
sind Weiterleitungen.Zuerst leiten Sie (
exec 1> >(tee $LOGFILE)
) denstdout
Deskriptor (1) zu einer durch Prozessersetzung generierten Pipe um, die mit einem gleichzeitig ausgeführtentee
Prozess verbunden ist$LOGFILE
, dessen erstes Argument darin besteht, und dann leiten Sie denstderr
Deskriptor (2) an dieselbe Stelle um, auf die der Deskriptor1
jetzt zeigt (das T-Stück) Rohr).Unter Berücksichtigung der Tatsache, dass die Filedescriptors vererbt werden, haben Sie gerade die gesamte Zukunft
stdout
undstderr
Ausgabe auf dentee
Prozess$LOGFILE
umgestellt , der sie an die Stelle schreibt, auf die der Filedescriptor 1 ursprünglich verwiesen hat (wahrscheinlich Ihr Terminal).Hinweis: Der Tee-Prozess wird auf die ursprüngliche Standardausgabe (= der ursprüngliche Filedescriptor 1) ausgegeben, da, wie Sie aus / search bash (1) für die einfache Befehlserweiterung und Prozessersetzung lernen können , die Prozessersetzung (
>()
<()
) (zusammen mit anderen Erweiterungen) zuvor erfolgt Umleitungen erhält ausgeführt, was bedeutet , dass die Umleitung inexec 1> >(tee "$LOGFILE")
geschieht , nachdemtee
begonnen hat, so dasstee
mit dem gleichen FileDescriptor 1 , dass sie von der übergeordneten Shell geerbt. (Wenn es umgekehrttee
wäre , würde es veranlasst, in seinen eigenen Eingang zu schreiben, was es abhängig von seinem E / A-Muster zum Deadlock machen könnte).quelle