Was passiert bei der Fehlerumleitung?

Was passiert bei der Fehlerumleitung?

Beim Lesen über Linux ist mir Folgendes aufgefallen:

Da „stderr“ nicht dasselbe ist wie „stdout“, werden im obigen Beispiel weiterhin Fehlermeldungen in den Terminalfenstern angezeigt.

Wenn Sie stderr in eine separate Datei umleiten möchten, verwenden Sie die Dateideskriptornummer von stderr (2), das Größer-als-Zeichen (>), gefolgt vom Namen der Datei, in der alles gespeichert werden soll, was der laufende Befehl in stderr schreibt:

$ do_something 2> error-file

Eine spezielle Kurzschreibweise kann verwendet werden, um alles, was in Dateideskriptor 2 (stderr) geschrieben wird, an die gleiche Stelle wie Dateideskriptor 1 (stdout) zu setzen: 2>&1

$ do_something > all-output-file 2>&1

bash erlaubt für das Obige eine einfachere Syntax:

$ do_something >& all-output-file

Hier do_somethingist ein Befehl. Ich verstehe wirklich nicht, was in allen drei oben genannten Befehlen im Hintergrund passiert. Ich weiß, &dass es verwendet wird, um einen Prozess zu einem Hintergrundprozess zu machen, aber ich verstehe die Logik nicht. Ich bin neu in dieser Variante, kann das bitte jemand erklären?

Antwort1

Ihre Verwirrung kann darauf zurückzuführen sein, dass >&es sich um etwas völlig anderes handelt als &.

>&oder <&werden bei der Umleitung verwendet, um auf einen Dateideskriptor (fd) zu verweisen. Die obigen Fälle leiten zu 1 und 2 um, also zu stdout bzw. stderr.

>bedeutet „stdout umleiten“

2>bedeutet „redirect fd 2 (stderr)“

>&2bedeutet „leite stdout auf fd 2 (stderr) um“. Beachten Sie, dass sich dies von >2„leite stdout auf eine Datei namens 2„ um“ unterscheidet – deshalb ist dies &wichtig. Es zeigt an, dass das nächste Element ein fd und kein Dateiname sein wird.

Wie Sie bemerkt haben, bedeutet es natürlich &etwas völlig anderes, wenn a allein ohne Umleitungssymbol steht – „sofort zurückkehren, vorhergehenden Befehl im Hintergrund ausführen.“

verwandte Informationen