exec und Abschlag in die Logdatei: Erkläre diese Bash-Befehle

15

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, $LOGFILEaber ich wollte es aus der Perspektive der execAnweisungen verstehen .

Senthil Kumaran
quelle
Dies könnte deutlich machen: linuxjournal.com/content/bash-redirections-using-exec
coffeMug
1
Sie haben dies oben in Ihrer Bash-Skriptdatei gesehen? ;)
Sebb
1
Die beiden execZeilen könnten durchaus nur eine ( exec > >(tee "$LOGFILE") 2>&1) sein.
Jonathan Leffler

Antworten:

18

Führt in Shells exec1) Dateiöffnungen und -umleitungen aus 2) das execAktualisieren (Ersetzen des aktuellen Prozessabbilds durch ein anderes Prozessabbild).

Dies execsind Weiterleitungen.

Zuerst leiten Sie ( exec 1> >(tee $LOGFILE)) den stdoutDeskriptor (1) zu einer durch Prozessersetzung generierten Pipe um, die mit einem gleichzeitig ausgeführten teeProzess verbunden ist $LOGFILE, dessen erstes Argument darin besteht, und dann leiten Sie den stderrDeskriptor (2) an dieselbe Stelle um, auf die der Deskriptor 1jetzt zeigt (das T-Stück) Rohr).

Unter Berücksichtigung der Tatsache, dass die Filedescriptors vererbt werden, haben Sie gerade die gesamte Zukunft stdoutund stderrAusgabe auf den teeProzess $LOGFILEumgestellt , 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 in exec 1> >(tee "$LOGFILE")geschieht , nachdem tee begonnen hat, so dass teemit dem gleichen FileDescriptor 1 , dass sie von der übergeordneten Shell geerbt. (Wenn es umgekehrt teewä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).

PSkocik
quelle