Was bedeutet> &?

80

Dieser Ausdruck hat mich ein wenig verwirrt:

gcc -c -g program.c >& compiler.txt

Ich weiß &>filename, dass sowohl stdout als auch stderr in die Datei umgeleitet werden filename. In diesem Fall steht das kaufmännische Und jedoch hinter dem Vorzeichen größer als. Es sieht aus wie in der Form M>&N, wo Mund Nsind Dateideskriptoren.

Im obigen Ausschnitt, M=1und N='compiler.txt'? Wie genau unterscheidet sich das von:

gcc -c -g program.c > compiler.txt     (ampersand removed)

Nach meinem Verständnis ist jeder geöffneten Datei ein Dateideskriptor größer als 2 zugeordnet. Ist das richtig?

Wenn ja, ist ein Dateiname mit seinem Dateideskriptor als Umleitungsziel austauschbar?

kontrapositiv
quelle

Antworten:

92

Dies ist das gleiche wie &>. Aus der Bash-Manpage:

Standardausgabe und Standardfehler umleiten Mit diesem Konstrukt können sowohl die Standardausgabe (Dateideskriptor 1) als auch die Standardfehlerausgabe (Dateideskriptor 2) in die Datei umgeleitet werden, deren Name die Erweiterung des Wortes ist.

There are two formats for  redirecting  standard  output  and  standard
error:

       &>word
and
       >&word

Of the two forms, the first is preferred.  This is semantically equiva-
lent to

       >word 2>&1
Jordanm
quelle
7
Ich fühle mich dumm. Ich habe eine Menge Zeit damit verbracht, andere Quellen zu lesen, und es war genau dort auf der Manpage.
kontrapositiv
3
>&ist die Syntax, die von csh und tcsh verwendet wird, um sowohl stdout als auch stderr umzuleiten. Das ist wahrscheinlich der Grund, warum Bash es akzeptiert.
Keith Thompson
4
Bedeutet das, dass &>wordund >word 2>&1semantisch äquivalent sind? Die Vorgeschichte von "Dies" ist mir nicht klar.
Genorama
8
@geneorama &>word, >word 2>&1, und >&word sind genau die gleichen.
Jordanm
1
Jetzt merke ich, dass ich vorher einen Fehler gemacht habe, basierend auf dem, was ich an anderer Stelle gelesen habe. >Leitet nur Standard aus. >leitet den Fehler nicht um. (Ich sollte wahrscheinlich meine zukünftigen Kommentare an /dev/null
weiterleiten
7

&>vs >&: die bevorzugte version ist &>(clobber)

Hinsichtlich:

  • &>
  • >&

In beiden Fällen wird die Datei überlastet. Schneiden Sie die Datei vor dem Schreiben auf 0 Byte ab, genau wie > filedies nur im Fall STDIN der Fall wäre.

Allerdings ist der bashmanuelle Umleitungen Abschnitt fügt hinzu , dass:

Von den beiden Formen ist die erste bevorzugt. Dies ist semantisch äquivalent zu

>word 2>&1

Bei Verwendung der zweiten Form wird das Wort möglicherweise nicht zu einer Zahl oder erweitert -. In diesem Fall gelten aus Kompatibilitätsgründen andere Umleitungsoperatoren (siehe Duplizieren von Dateideskriptoren unten).

(Hinweis: in zshbeiden sind gleichwertig .)

Es ist eine sehr gute Praxis, das Fingerspeicher in der ersten ( &>) Form zu erhalten, weil:

Verwenden Sie so, &>>wie >>&es nicht unterstützt wird bash(anhängen)

Es gibt nur ein Formular zum Anhängen:

Das Format zum Anhängen der Standardausgabe und des Standardfehlers lautet:

&>>word

Dies ist semantisch äquivalent zu

>>word 2>&1

(Siehe Duplizieren von Dateideskriptoren weiter unten).

Hinweis:

  • Die Clobber-Nutzung von &> Over >&im obigen Abschnitt wird erneut empfohlen, da es nur einen Weg zum Anhängen gibt bash.
  • zsherlaubt beides &>>und >>&Formen.
Tom Hale
quelle
Diese Antwort ist viel hilfreicher als die positiv bewertete Antwort.
Jägerin
Ist es also &ein Sonderzeichen, das vom Shell-Interpreter in 1 und 2 konvertiert wird?
Fakher Mokadem
@ FakherMokadem Nein, siehe Handbuch .
Tom Hale