it-swarm.com.de

Unterschied zwischen 2> & -, 2> / dev / null, | &, &> / dev / null und> / dev / null 2> & 1

Ich suche nur nach dem Unterschied zwischen

  • 2>&-
  • 2>/dev/null
  • |&
  • &>/dev/null
  • >/dev/null 2>&1

und ihre Portabilität mit non-Bourne shells wie tcsh, mksh usw.

208
Det

Zum Hintergrund:

  • a number 1 = standard out (i.e. STDOUT)
  • a number 2 = standard error (i.e. STDERR)
  • wenn eine Zahl nicht explizit angegeben wird, wird Nummer 1 von der Shell angenommen (bash)

Lassen Sie uns zunächst die Funktion dieser behandeln. Als Referenz siehe Advanced Bash-Scripting Guide .

Funktionen

2>&-

Die allgemeine Form von diesem ist M>&-, Wobei "M" eine Dateideskriptornummer ist. Dadurch wird die Ausgabe für jeden Dateideskriptor geschlossen, auf den verwiesen wird, d. H. "M" .

2>/dev/null

Die allgemeine Form von diesem ist M>/dev/null, Wobei "M" eine Dateideskriptornummer ist. Dadurch wird der Dateideskriptor "M" auf /dev/null Umgeleitet.

2>&1

Die allgemeine Form von diesem ist M>&N, Wobei "M" & "N" sind Dateideskriptornummern. Es kombiniert die Ausgabe der Dateideskriptoren "M" und "N" in einen einzigen Strom.

|&

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. Es leitet den Dateideskriptor 2 (STDERR) und den Deskriptor 1 (STDOUT) nach /dev/null Um.

>/dev/null

Dies ist nur eine Abkürzung für 1>/dev/null. Es leitet den Dateideskriptor 1 (STDOUT) nach /dev/null Um.

Portabilität auf Non-Bash, TCC, MKSH usw.

Ich habe mich nicht viel mit anderen Shells außerhalb von csh und tcsh beschäftigt. Meine Erfahrung mit diesen 2 im Vergleich zu den Umleitungsoperatoren von bash ist, dass bash in dieser Hinsicht überlegen ist. Weitere Informationen finden Sie in 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.

256
slm

Dies dient zum Umleiten von STDERR & STDOUT:

  • 2>/dev/null

    Leiten Sie STDERR nach/dev/null um (verhindern Sie, dass es auf der Konsole angezeigt wird)

  • |&

    Leiten Sie STDERR und STDOUT zu STDIN des Pipe-Befehls um (cmd1 | & cmd2).

  • &>/dev/null

    Leiten Sie sowohl STDERR als auch STDOUT nach/dev/null um (auf der Konsole wird nichts angezeigt)

  • >/dev/null

    Leiten Sie STDOUT nach/dev/null um (nur STDERR wird auf der Konsole angezeigt)

  • 2>&-

    Dient zum Schließen eines Dateideskriptors, der bei der Umleitung verwendet wird

Dies sind alles Standard-Umleitungsmethoden für die Bourne-Shells.

12
BriGuy

Betrachten Sie dies als Nachtrag zur ausgewählten Antwort. Vielleicht möchten Sie wissen, welche Formulare POSIX sind und welche nicht.

Es handelt sich um zwei POSIX-Formulare:

2.7.2 Ausgabe umleiten

Die zwei allgemeinen Formate zum Umleiten der Ausgabe sind:

[n]> Wort

[n]> | Word

dabei steht das optionale n für die Dateideskriptornummer. Wenn die Nummer weggelassen wird, bezieht sich die Umleitung auf die Standardausgabe (Dateideskriptor 1).

Die Ausgabeumleitung im Format '>' schlägt fehl, wenn die Option noclobber festgelegt ist (siehe Beschreibung von set -C) und die durch die Erweiterung von Word benannte Datei vorhanden ist und eine reguläre Datei ist. Andernfalls wird die Umleitung mit '>' oder "> |" Formate bewirken, dass die Datei, deren Name aus der Erweiterung von Word resultiert, erstellt und zur Ausgabe im angegebenen Dateideskriptor oder zur Standardausgabe geöffnet wird, wenn keine angegeben ist. Wenn die Datei nicht vorhanden ist, wird sie erstellt. Andernfalls wird es nach dem Öffnen als leere Datei abgeschnitten.

- -

2.7.6 Duplizieren eines Ausgabedateideskriptors

Der Umleitungsoperator:

[n]> & Word

dupliziert einen Ausgabedateideskriptor von einem anderen oder schließt einen. Wenn Word eine oder mehrere Ziffern ergibt, wird der mit n bezeichnete Dateideskriptor oder die Standardausgabe, wenn n nicht angegeben ist, als Kopie des mit Word bezeichneten Dateideskriptors erstellt. Wenn die Ziffern in Word keinen bereits für die Ausgabe geöffneten Dateideskriptor darstellen, tritt ein Umleitungsfehler auf. Siehe Folgen von Shell-Fehlern. Wenn Word '-' ergibt, wird der Dateideskriptor n oder die Standardausgabe, wenn n nicht angegeben ist, geschlossen. Versuche, einen nicht geöffneten Dateideskriptor zu schließen, stellen keinen Fehler dar. Wenn Word zu etwas anderem ausgewertet wird, ist das Verhalten nicht angegeben.

Deshalb:

Function      POSIX-compat    POSIX 
2>&-          Yes             close 
2>/dev/null   Yes             redir
2>&1          Yes             dup 
|&            No              
&>/dev/null   No
>/dev/null    Yes             redir
>&/dev/null   ?               ?dup

Die letzte Zeile ist nicht in der ursprünglichen Frage, aber es funktioniert ohne Beschwerde in Bash. (Funktioniert auch mit/dev/tty anstelle von/dev/null).

4
Craig Hicks