Es gibt zwei Arten, die Standardausgabe und den Standardfehler in die Standardausgabe umzuleiten . Aber welches ist besser? und warum &>
gilt das als perfekt?
Ich kann nicht finden, was die Unterschiede sind, so dass viele Tutorials und sogar Bash-Handbücher &>
besser sind!
Also warum soll ich verwenden &>
und nicht2>&1
Hauptsächlich mit bash
Shell
EDIT: Danke für die Kommentare
Nur> & funktioniert in csh oder tcsh
In ksh funktioniert nur 2> & 1.
Nur Bindestrich verwenden> Datei 2> & 1 Umleitung
Dann welches, um sicherzustellen, dass mein Skript mit anderen Systemen kompatibel ist, unabhängig von den verwendeten Shells!
command-line
bash
redirect
Maythux
quelle
quelle
&> somewhere
ist nur die Abkürzung für bash> somewhere 2>&1
: In den Worten des bash-Handbuchs sind sie "symantisch äquivalent"Antworten:
In der Manpage von Bash wird erwähnt, dass es zwei Möglichkeiten gibt, stderr und stdout umzuleiten :
&> file
und>& file
. Beachten Sie, dass hier sowohl stderr als auch stdout steht.In diesem Fall
>file 2>&1
leiten wir stdout (1) in file um, teilen aber auch stderr (2) mit, dass es an dieselbe Stelle wie stdout umgeleitet werden soll! Der Zweck mag also derselbe sein, aber die Idee ist etwas anders. Mit anderen Worten: "John, geh zur Schule; Suzzie geh dahin, wohin John geht".Was ist mit Präferenz?
&>
ist einebash
Sache. Wenn Sie also ein Skript portieren, ist dies nicht der Fall. Aber wenn Sie zu 100% sicher sind, dass Ihr Skript nur mit bash auf dem System funktioniert, ist das egalHier ist ein Beispiel mit
dash
der Debian-Amquist-Shell, die Ubuntus Standard ist.Wie Sie sehen, wird stderr nicht umgeleitet
Um Ihre Änderungen in der Frage zu berücksichtigen, können Sie mit der if-Anweisung die Variable $ SHELL überprüfen und die Weiterleitungen entsprechend ändern
Sollte aber in den meisten Fällen
> file 2>&1
funktionierenIn technischer Hinsicht ist die Form
[integer]>&word
genannt wird Duplicating Output File Descriptor und ist eine Funktion von POSIX Shell Command Language - Standard spezifiziert, die von den meisten POSIX-konform und Brourne artigen Schalen unterstützt wird.Siehe auch Was bedeutet & genau in der Ausgabeumleitung?
quelle
&>
.... @Maythux In Shells, die nicht unterstützen , müssen Sie&>
z. B.dash
die>file 2>&1
>file 2>&1
. Diese Arbeit an allen Muscheln/etc/passwd
Für jeden Benutzer festgelegte Shells sind interaktive Shells. Systemskripte sind in der Regel fürdash
sofern nicht anders angegeben. Was die Standardeinstellung betrifft, hängt es davon ab, was/bin/sh
in Ubuntus Fall damit zusammenhängtdash
. In RHEL ist esbash
, in FreeBSD ist estcsh
Quelle und eine andere QuelleIch würde generell empfehlen, die Vorgehensweise von Bourne-again SHell zu befolgen , da bash die wohl beliebteste Unix-Shell überhaupt ist. Bash verwendet normalerweise entweder
&>
oder2>&1
. IMHO, keiner ist "perfekt", also empfehle ich, diesen Unsinn zu vergessen. Welches Sie verwenden sollten, hängt realistisch davon ab, was Sie zu tun versuchen.2>&1
Führt stderr mit stdout zusammen. Dies kann nützlich sein, wenn Sie beispielsweise stderr-Text weiterleiten möchten. Wenn Sie zum Beispiel sehen möchten, ob ein Programm eine bestimmte stderr-Nachricht druckt, aber nicht möchten, dass Ihr Bildschirm mit (vermutlich) unwichtigem Müll gefüllt ist, können Sie so etwas tunprogram 2>&1 | grep crashed
, dass stdout und stderr von einem Programm aus durchsucht genannt "Programm" für das Wort "abgestürzt".Wenn Sie jedoch nicht möchten, dass ein Programm überhaupt etwas druckt, können Sie einfach
program &> /dev/null
eine spezielle Datei ausführen , die stderr und stdout nach / dev / null umleitet und die Dinge auf magische Weise verschwinden lässt. Wenn Sie die Ausgabe eines Programms speichern möchten (um möglicherweise einen Fehler oder etwas zu melden), können Sie sowohl stderr als auch stdout in eine Dateiprogram &> log.txt
umleiten: Alle Daten werden in eine Datei namens "log.txt" umgeleitet. Wenn Sie möchten , können Sie stdout und stderr überprogram 2> log.txt > log.txt
oder umleiten.program 2>&1 | cat > log.txt
Beide haben den gleichen Effekt wie using&>
. Wenn Sie so etwas tunprogram 2>&1 > file
, wird nur stdout umgeleitet, stderr kann jedoch weiterhin an ein anderes Programm wie cat weitergeleitet werden, das wie oben gezeigt umgeleitet werden kann. Tippen Sie jedoch&>
ist einfacher als jedes der obigen Beispiele, da weniger Zeichen eingegeben werden müssen (und es für Menschen ein bisschen einfacher zu lesen ist). Beachten Sie, dassprogram 2> log.txt > log.txt
dies mit größerer Wahrscheinlichkeit bei Nicht-Bash-Shells der Fall sein kann.PS: Wenn Sie sich Sorgen machen, dass andere Benutzer andere Shells verwenden, können Sie eine erste Zeile Ihres Skripts hinzufügen, die als "magische Zahl" oder "Schebang" bezeichnet wird. Dies ist im Wesentlichen eine Möglichkeit, um sicherzustellen, dass andere Computer (insbesondere solche mit Unix-ähnlichen Betriebssystemen) wissen, mit welchem Programm ein Skript ausgeführt werden soll. Unterschiedliche Skripte verwenden unterschiedliche Shebangs. Ein Shebang für ein Bash-Skript sieht folgendermaßen aus:
Wenn Sie das Obige als erste Zeile eines bestimmten Skripts verwenden, wird bash im Allgemeinen zum Ausführen des Skripts verwendet. Dadurch wird es für jemanden viel schwieriger, das Skript versehentlich mit der falschen Shell auszuführen.
PS: Ich werde nicht lügen: Bis jetzt wusste ich nicht, dass man es gebrauchen kann
>&
, aber was Bash angeht, scheint es dasselbe zu tun wie&>
. Sie lernen jeden Tag etwas Neues.quelle
#!
Leitung ausdrücklich angefordert wirdbash
, sie ist jedoch auf anderen Systemen nicht immer verfügbar. Sehr oft müssen Entwickler / Systemadministratoren portable Skripte für Systeme schreiben, auf denen siebash
möglicherweise nicht verfügbar sind und deren Installation nicht unter ihrer Kontrolle stehtbash
. Das>file 2>&1
ist halt viel tragbarer.>file 2>&1
portabler ist, ist gut zu wissen. Ich werde eine Bearbeitung vornehmen, um das zu reflektieren.Aus dem Bash-Referenzhandbuch -> 3.6.4 Umleiten der Standardausgabe und des Standardfehlers :
Ebenfalls gut zu Gregs Wiki zu Input und Output -> 4.2. Manipulation des Dateideskriptors :
quelle
2>&1
ist die Standard-Bourne / POSIX-Shell.&>
ist eine Bash-Erweiterung und nicht de jure Standard.Wenn Sie Skripte mit Bash-Erweiterungen schreiben, treten früher oder später bei Fehlern in der kryptischen Syntax Kratzer auf, weil sie in einer Standard-Shell ausgeführt werden.
quelle