ip link help
druckt auf Standardfehler (stderr, Dateideskriptor 2
); seine Standardausgabe (stdout, Dateideskriptor 1
) erhält keine Daten. Normalerweise gehen die beiden Streams zum Terminal, sodass Sie sie auf den ersten Blick nicht wirklich unterscheiden können. |
oder >
beeinflusst die Standardausgabe. Nachdem Sie es verwendet haben, wissen Sie, dass alle Daten, die umgeleitet werden, für stdout bestimmt sein müssen. alles andere - nach anderswo: in der Regel zu stderr, obwohl einige Programme einige Daten direkt auf das Terminal drucken ( ip
gehört nicht dazu).
In Ihrem ersten Fall können Sie stderr zum Dateideskriptor von stdout umleiten und dann eine Pipe erstellen:
ip link help 2>&1 | grep set
Dabei 2>&1
wird der Shell mitgeteilt, dass sie den Dateideskriptor auf das umleiten soll, auf das 2
der Dateideskriptor 1
verweist. Mit dieser Syntax würde alles, wenn der Befehl etwas an stdout und stderr gedruckt hat, zustande kommen grep
.
Im zweiten Fall erstellt die Shell die Datei (falls erforderlich) und schneidet sie ab, bevor sie ausgeführt ip
wird. Sie können dies durch Aufrufen von sehen
a_command_that_doesnt_even_exist > foo.txt
foo.txt
wird trotz des offensichtlichen Fehlers erstellt. Dies liegt daran, dass es zuerst erstellt wird, noch bevor die Shell den Befehl ausführt.
Um stderr in der Datei zu erfassen, verwenden Sie nur 2>
die Weiterleitung von stderr:
ip link help 2> ip_link_help.txt
1>
Leitet ähnlich nur stdout um. Kurz, das >
Sie verwendet haben, ist absolut gleichwertig 1>
.
Ein künstliches Beispiel für einen Befehl, der auf drei verschiedene Arten an das Terminal druckt, ist
echo "standard output"; echo "standard error" >&2; echo "terminal" >/dev/tty
Die Ausgabe ist:
standard output standard error terminal
Sie können die ersten beiden Zeilen problemlos umleiten. Versuche dies:
(echo "standard output"; echo "standard error" >&2; echo "terminal" >/dev/tty) >stdout.txt 2>stderr.txt
Dadurch wird jedoch immer noch die letzte Zeile gedruckt.