Ich suche nur den Unterschied zwischen
2>&-
2>/dev/null
|&
&>/dev/null
>/dev/null 2>&1
und ihre Portabilität mit non-Bourne shells
wie tcsh
, mksh
usw.
Ich suche nur den Unterschied zwischen
2>&-
2>/dev/null
|&
&>/dev/null
>/dev/null 2>&1
und ihre Portabilität mit non-Bourne shells
wie tcsh
, mksh
usw.
&>
GNU-Bash-Kompatibilität unterstützt, jedoch dringend davon abgeraten wird , da das Parsen die Semantik vorhandener POSIX-Skripte unterbrechen kann und mksh diese bereits im POSIX-Modus deaktiviert.^ /dev/null
was das macht?Antworten:
Zum Hintergrund:
Lassen Sie uns zuerst die Funktion von diesen angehen. Informationen hierzu finden Sie im Advanced Bash-Scripting Guide .
Funktionen
2>&-
Die allgemeine Form von diesem ist
M>&-
, wobei "M" eine Dateideskriptornummer ist. Dies schließt die Ausgabe für jeden Dateideskriptor, auf den verwiesen wird, dh "M" .2>/dev/null
Die allgemeine Form von diesem ist
M>/dev/null
, wobei "M" eine Dateideskriptornummer ist. Dadurch wird der Dateideskriptor "M" nach umgeleitet/dev/null
.2>&1
Die allgemeine Form von diesem ist
M>&N
, wo "M" & "N" Dateideskriptornummern sind. Es kombiniert die Ausgabe der Dateideskriptoren "M" und "N" in einem einzigen Stream.|&
Dies ist nur eine Abkürzung für
2>&1 |
. Es wurde in Bash 4 hinzugefügt.&>/dev/null
Dies ist nur eine Abkürzung für
>/dev/null 2>&1
. Er leitet den Dateideskriptor 2 (STDERR) und den Deskriptor 1 (STDOUT) an um/dev/null
.>/dev/null
Dies ist nur eine Abkürzung für
1>/dev/null
. Es leitet den Dateideskriptor 1 (STDOUT) weiter zu/dev/null
.Portabilität auf Nicht-Bash, TCSH, MKSH usw.
Ich habe mich nicht viel mit anderen Muscheln außerhalb von
csh
und befassttcsh
. Meine Erfahrung mit diesen 2 verglichen mit den Umleitungsoperatoren von bash ist, dass bash in dieser Hinsicht überlegen ist. Weitere Informationen finden Sie auf der tcsh-Manpage .Von den Befehlen, nach denen Sie gefragt haben, werden keine direkt von csh / tcsh unterstützt. Sie müssten unterschiedliche Syntaxen verwenden, um ähnliche Funktionen zu erstellen.
quelle
2>&-
vs2>/dev/null
(abgesehen davon2>&-
, dass einige "schlecht" geschriebene Programme nicht richtig verstehen )?&>
warbash
von Anfang an dabei (und bricht die Bourne- und POSIX-Kompatibilität, da es etwas anderes bedeutet, obwohl es unwahrscheinlich ist, dass es getroffen wird).>&
und|&
kommen von(t)csh
(und es ist ihre einzige Möglichkeit, stderr umzuleiten). Sie warenzsh
von Anfang an dabei und wurden erst kürzlich hinzugefügtbash
. Siehe auchrc
für besser gestaltete Operatoren.(+2-2=0)
. Nun zum Ausgabe-Teil, ich bearbeite nicht viel, aber in diesem Fall würde ich, weil es klarstellt, dass die Daten nach der Operation bei wärenN
. Ich habe Ihre Antwort durchgelesen und sie ist in jeder Hinsicht in Ordnung. Gerade diese kleine Zweideutigkeit hat mich zum Nachdenken gebracht, deshalb die Edition. Aber ok, Sie können es jederzeit wieder hinzufügen oder ablehnen. Ich hoffe, ich konnte den Punkt erklären. Mach weiter so.Dies ist für die Umleitung der STDERR & STDOUT:
2>/dev/null
Leiten Sie STDERR nach / dev / null um (verhindern Sie, dass es auf der Konsole angezeigt wird)
|&
Umleiten von STDERR und STDOUT zu STDIN des weitergeleiteten Befehls (cmd1 | & cmd2)
&>/dev/null
Leiten Sie sowohl STDERR als auch STDOUT nach / dev / null um (auf der Konsole wird nichts angezeigt)
>/dev/null
STDOUT nach / dev / null umleiten (nur STDERR wird auf der Konsole angezeigt)
2>&-
Dient zum Schließen eines mit der Umleitung verwendeten Dateideskriptors
Dies sind alle Standardumleitungsmethoden für die Bourne-Shells.
quelle
|&
und&>/dev/null
sind nicht tragbar.Betrachten Sie dies als Ergänzung zur ausgewählten Antwort. Vielleicht möchten Sie wissen, welche Formulare POSIX sind und welche nicht.
Es handelt sich um zwei POSIX-Formulare:
-
Deshalb:
Die letzte Zeile ist nicht in der ursprünglichen Frage, aber es funktioniert ohne Beanstandung in Bash. (Funktioniert auch mit / dev / tty anstelle von / dev / null).
quelle