Was macht 'exec {fd} </ dev / watchdog' in Bash?

28

Das ist wörtlich, {fd}kein Platzhalter. Ich habe ein Skript, das dies ausführt und weder in irgendetwas Quellen noch irgendwo anders auf {fd} verweist. Ist das eine gültige Bash?

exec {fd}</dev/watchdog

Gregg Leventhal
quelle

Antworten:

34

Anstatt einen Dateideskriptor auswählen zu müssen und zu hoffen, dass er verfügbar ist:

exec 4< /dev/watchdog  # Was 4 in use? Who knows?

Diese Notation fordert die Shell auf, einen Dateideskriptor auszuwählen, der derzeit nicht verwendet wird, die Datei zum Lesen auf diesem Deskriptor zu öffnen und der angegebenen Variablen die Nummer zuzuweisen ( fd).

$ exec {fd}< /dev/watchdog
$ echo $fd
10
chepner
quelle
Ich bin sicher, dass Sie Recht haben, denn (1) ich erinnere mich, dass ich es irgendwo gelesen habe, und (2) ich habe es gerade ausprobiert (und es funktioniert). Aber ich konnte es nirgendwo dokumentiert finden. (Natürlich hatte ich weniger als zehn Minuten Zeit, um nach Ihrer Antwort zu suchen.) Können Sie einen Verweis darauf geben, wo sie dokumentiert ist?
Scott
2
Siehe Manpage, 2. Absatz des Abschnitts REDIRECTIONS. Es springt nicht wirklich auf dich los, da sie kein explizites Beispiel geben.
Chepner
Sie haben Recht, ich habe es bei einem Mannschlag verpasst, aber es ist dort, wo Sie gesagt haben. Es sollte beachtet werden, dass jedes Wort, nicht nur fd, in geschweiften Klammern steht und ein fd> = 10 zugewiesen wird.
Gregg Leventhal
3
@Scott, nicht nur in Bash, sondern auch in Bash 4.1 oder neuer (daher nicht verfügbar in den 3.2-Versionen, die noch unter MacOS verwendet werden).
Charles Duffy
2
@CharlesDuffy /dev/watchdoggibt es jedoch auch unter Mac OS X nicht. Es ist ein Linux-spezifisches Gerät.
Duskwuff
11

Die Form:

{var}<filename

Die Shell hat die Datei filenamezum Lesen geöffnet und die Dateideskriptornummer in der Variable gespeichert var. Zwischen {var}den Operatoren und den Umleitungsoperatoren ist kein Leerzeichen zulässig , und die Dateideskriptornummer ist größer oder gleich 10.

Diese Funktion war ursprünglich von ksh(ab Version ksh93r im Jahr 2006) und wurde bashviel später im Jahr bash-4.1-alpha2010 kopiert. zshDie Änderung erfolgte auch früher als bashab zsh 4.3.42007.

cuonglm
quelle
2

Dies wird im Abschnitt Bash-Handbuch zu Umleitungen erläutert .

Vor jeder Umleitung, der eine Dateideskriptornummer vorangestellt sein kann, kann stattdessen ein Wort der Form { varname } stehen. In diesem Fall weist die Shell für jeden Umleitungsoperator außer >&-und <&-einen Dateideskriptor zu, der größer als 10 ist, und weist ihn { varname } zu. Wenn vor >&-oder <&-{ varname } steht, definiert der Wert von varname den zu schließenden Dateideskriptor.

Barmar
quelle