stdin, stderr, redirection und logs

7

Gibt es einen Unterschied zwischen diesen beiden Zeilen?

/home/user/script.sh >> /home/user/stdout_and_error.log  2>&1
/home/user/script.sh 2>&1 >> /home/user/stdout_and_error.log  

zu wissen, dass ich die Standard- und Ausführungsfehler des Skripts in die Protokolldatei einfügen möchte. Wenn es keine Unterschiede gibt, was ist, wenn ich die Protokollierung selbst protokollieren möchte?

4m1nh4j1
quelle
3
Wäre es nicht sehr einfach zu versuchen, ob das Ergebnis das gleiche ist? Und viel schneller als hier zu fragen? Fragen, die nicht einmal einen kleinen Forschungsaufwand zeigen, sind hier weniger willkommen.
Hauke ​​Laging
1
@HaukeLaging: Es ist immer noch eine nützliche Frage.
Brian
@staticx Na und?
Hauke ​​Laging
@Hauke: Also ist nichts falsch daran
Brian
1
@staticx Wenn Sie das Offensichtliche ignorieren, verweise ich Sie auf die offizielle Einschätzung: unix.stackexchange.com/help/how-to-ask Und es bedeutet sicherlich nicht "Forschen oder thematisch sein"
Hauke ​​Laging

Antworten:

14

Ja, da gibt es einen Unterschied.

/home/user/script.sh >> /home/user/stdout_and_error.log  2>&1

Dadurch werden sowohl STDOUT als auch STDERR an gesendet /home/user/stdout_and_error.log.

/home/user/script.sh 2>&1 >> /home/user/stdout_and_error.log  

Dadurch wird STDOUT an /home/user/stdout_and_error.logund STDERR an STDOUT gesendet.

 

Wenn Sie eine Shell-Umleitung durchführen, wird die linke Seite der Umleitung an die Stelle weitergeleitet, an der sich die rechte Seite der Umleitung gerade befindet. Das heißt 2>&1, es sendet STDERR (2) an den Ort, an den STDOUT (1) gerade geht.
Wenn Sie STDOUT jedoch später an eine andere Stelle umleiten, passt STDERR nicht dazu. Es geht weiter, wohin STDOUT zuvor ging. Aus diesem Grund werden in Ihrem ersten Beispiel sowohl STDOUT als auch STDERR an denselben Ort verschoben, im zweiten jedoch nicht.

Patrick
quelle
5

In der ersten Befehlszeile sieht die Shell zuerst >> Datei und hängt stdout an Datei an. Die nächsten 2> & 1 senden fd2 (stderr) an denselben Ort, an den fd1 geht - das ist in die Datei. Und genau das willst du.

In der zweiten Befehlszeile sieht die Shell zuerst 2> & 1. Das bedeutet, dass "der Standardfehler (Dateideskriptor 2) an dieselbe Stelle verschoben wird wie die Standardausgabe (fd1)". Es gibt keine Auswirkung, da sowohl fd2 als auch fd1 bereits zum Terminal gehen. Dann >> Datei hängt fd1 (stdout) an die Datei an. Aber fd2 (stderr) geht immer noch zum Terminal.

cioby23
quelle
3

>> Anhängen von stdout (Stream Nr. 1) an eine Datei.

2>&1 Kombinieren von stderr (Stream # 2) mit stdout (Stream # 1) (Fügt stderr zu stdout hinzu)

> Schreibt stdout (Stream Nr. 1) in eine Datei und überschreibt die Datei.

1>Schreibt stdout (Stream Nr. 1) in eine Datei und überschreibt die Datei. Das gleiche wie oben.

2>Schreibt stderr (Stream # 2) in eine Datei und überschreibt die Datei.

+++

Ihr erstes Beispiel wäre, stdout an eine Datei anzuhängen und dann stderr zu stdout hinzuzufügen.

Ihr zweites Beispiel würde stderr zu stdout hinzufügen und dann das kombinierte stdout (einschließlich stderr) an eine Datei anhängen .

Baard Kopperud
quelle
3
Nein, das zweite Beispiel sendet die stderrto-Datei nicht, stderrging zu file descrpitor 1.
Cuonglm