2017-02-04 1 views

Antwort

1

Mit Umleitungen, Bestellung ist wichtig. Mach es andersherum.

ls -yz >>command.log 2>&1 

Umleitungen funktionieren durch "Kopieren von Dateideskriptoren". Wenn Sie versuchen, stderr zuerst umzuleiten (bevor stdout umgeleitet wird), wird stderr an die Stelle gesendet, an der stdout derzeit geht, was das Terminal ist. Wenn Sie später stdout in Ihre Datei umleiten, wird dies nicht noch einmal zum redirect stderr zurückgeleitet.

+2

Ich würde eine Erklärung zu den Downvote sehr schätzen, als ob meine Antwort nicht die richtige ist, werde ich hier etwas lernen. – Fred

+0

Ich denke OP weiß, dass die Reihenfolge zählt, die Frage ist "warum" es wichtig ist. Beachten Sie, dass die zwei Ordnungen nebeneinander auf der Seite angezeigt werden, die durch OP verbunden ist, so viel ist ziemlich klar. – janos

1

Standardmäßig sind beide stdout & stderr auf das Terminal gerichtet. In dem Befehl in Ihrer Frage, 2>&1 sagt shell stderr an die gleiche Stelle wie stdout zu senden. Es ist wie ein No-Op, weil stdout an diesem Punkt immer noch zum Terminal geht, an derselben Stelle wie stderr. >> command.log wird danach geparst und am Ende wird nur stdout an diese Datei gesendet. Die Reihenfolge ist wichtig, wie @Fred zu Recht sagt.

Kürzere Weg, dies zu tun ist:

ls -yz &>> command.log 
3

Zunächst einmal beachten Sie, dass >log ist eine kurze Hand für 1>log. Die N>M Syntax wird in Zeigerzuweisungen konvertiert. Lassen Sie uns den Zeiger auf Standardausgabe fd1 und den Zeiger auf Standardfehler fd2 aufrufen.Das heißt:

  • fd1 ist ein Zeiger auf stdout
  • fd2 ist ein Zeiger auf stderr

Wenn Sie ausführen cmd 2>&1 >log, ändert es die Zeiger wie folgt aus:

  • machen fd2 zeigen Sie auf, was fd1 zeigt, wasist
  • fd1 Punkt in einer Datei
  • => als Ergebnis fd2 Punkte zu stdout und fd1 auf eine Datei machen

Wenn Sie ausführen cmd >log 2>&1, es ändert sich die Zeiger wie folgt aus:

  • make fd1 zeigen Sie auf eine Datei
  • make fd2 Punkt, was fd1 Punkte, die die Datei
  • => als Ergebnis ist sowohl fd1 und fd2 auf die gleiche Datei

Das heißt, auf der Grundlage der Reihenfolge der Zeiger Neuzuordnungen, wird das Ergebnis anders sein. In einem Fall zeigen beide Zeiger auf dasselbe oder sie zeigen auf verschiedene Dinge.

Statt ls -yz als Beispiel Befehl cmd der Verwendung finde ich ein geeignetes Beispiel, dies zu erklären ist ls yes nonexistent, wo yes eine Datei ist, die vorhanden ist, und nonexistent ist eine Datei, die nicht der Fall ist. In diesem Beispiel wird sowohl auf stdout als auch auf stderr etwas gedruckt, und wenn Sie mit der Reihenfolge N>M spielen, können Sie deutlicher sehen, wo beide enden. (Mit ls -yz, gibt es nur stderr, während stdout ist leer.)

+1

Sehr gut erklärt! – codeforester

Verwandte Themen