> & [FILE_DESCRIPTOR] vs> & File-Bash-Umleitungsoperatoren
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 &>fileIst genau das gleiche wie:
$ command >&fileDie erste Form ist jedoch bevorzugt.
Wie kommt es, >&filedass Sie fileeinen Dateideskriptor erstellen?
Antworten
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.