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
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
Antworten:
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
REDIRECTIONS
. Es springt nicht wirklich auf dich los, da sie kein explizites Beispiel geben.
/dev/watchdog
gibt es jedoch auch unter Mac OS X nicht. Es ist ein Linux-spezifisches Gerät.
Die Form:
{var}<filename
Die Shell hat die Datei filename
zum 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 bash
viel später im Jahr bash-4.1-alpha
2010 kopiert. zsh
Die Änderung erfolgte auch früher als bash
ab zsh 4.3.4
2007.
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.