> & [FILE_DESCRIPTOR] vs> & File-Bash-Umleitungsoperatoren

Oct 16 2020

Ich habe über Bash-Weiterleitung gelesen und bin auf diese beiden Artikel darüber gestoßen

  • Erster :

    https://www.brianstorti.com/understanding-shell-script-idiom-redirect

    das zu sagen

    Sie können & [FILE_DESCRIPTOR] verwenden, um auf einen Dateideskriptorwert zu verweisen.

    Als ich es jedoch gleichzeitig mit dem zweiten Artikel las

  • der zweite

    https://catonmat.net/bash-one-liners-explained-part-three

    es stellte fest, dass

    Beachten Sie auch, dass Sie in bash Folgendes schreiben:

    $ command &>file
    

    Ist genau das gleiche wie:

    $ command >&file
    

    Die erste Form ist jedoch bevorzugt.

Wie kommt es, >&filedass Sie fileeinen Dateideskriptor erstellen?

Antworten

4 StéphaneChazelas Oct 16 2020 at 12:10

Es sind tatsächlich zwei verschiedene Operatoren, die miteinander in Konflikt stehen, einer aus der Bourne-Shell und einer aus der C-Shell.

cmd >&2

Kurz für

cmd 1>&2

Wird der Bourne-Shell-Operator, der cmdmit seinem stdout (fd 1) ausgeführt wird, mit derselben Ressource (dieselbe Beschreibung der geöffneten Datei ) verbunden wie der auf fd 2 ( x>&y(oder x<&ygenau derselbe)), leitet fd x an dieselbe Ressource wie auf fd y um ).

cmd >& file

Ist der C-Shell ( csh) -Operator, der cmdmit fd 1 und 2 ausgeführt wird, mit einer neuen Beschreibung der geöffneten Datei verbunden, die durch Öffnen fileim Nur-Schreib-Modus erhalten wird? In der Bourne-Shell-Syntax wäre das Äquivalentcmd > file 2>&1

Sie machen Konflikte. Welches tatsächlich verwendet wird, hängt davon ab, ob das Ziel numerisch ist oder nicht.

Wenn Sie haben:

cmd >&"$file"

Der Bourne-Shell-Operator wird verwendet, wenn er $fileeine Folge von Dezimalstellen enthält, und der C-Shell-Operator wird anderweitig verwendet!

Aus diesem Grund ist es besser, diesen csh-Operator zu vermeiden und > file 2>&1stattdessen die Bourne-Shell-Syntax ( ) zu verwenden.

bash(und zsh) hat auch einen &>Operator als Alternative zu >&, aber beachten Sie, dass er die POSIX-Konformität verletzt, wie sie ausgeführt cmd &> filewerden soll, cmd &und dann > filein POSIX sh. Es hat jedoch nicht das oben erwähnte Konfliktproblem.