Que fait 'exec {fd} </ dev / watchdog' dans Bash

28

C'est littéral, ce {fd}n'est pas un espace réservé. J'ai un script qui fait cela, et ne source rien, ni ne fait référence à {fd} nulle part ailleurs. Est-ce que c'est bash valide?

exec {fd}</dev/watchdog

Gregg Leventhal
la source

Réponses:

34

Plutôt que d'avoir à choisir un descripteur de fichier et espérer qu'il soit disponible:

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

cette notation demande au shell de choisir un descripteur de fichier qui n'est pas actuellement utilisé, d'ouvrir le fichier pour lire sur ce descripteur et d'attribuer le numéro à la variable donnée ( fd).

$ exec {fd}< /dev/watchdog
$ echo $fd
10
chepner
la source
Je suis sûr que vous avez raison, car (1) je me souviens l'avoir lu quelque part, et (2) je viens de l'essayer (et cela fonctionne). Mais je n'ai pu le trouver documenté nulle part. (Bien sûr, j'avais moins de dix minutes pour effectuer une recherche avant de publier votre réponse.) Pouvez-vous indiquer où elle est documentée?
Scott
2
Voir la page de manuel, 2ème paragraphe de la section REDIRECTIONS. Cela ne vous saute pas vraiment aux yeux, car ils ne donnent pas d'exemple explicite.
chepner
Vous avez raison, je l'ai manqué dans l'homme bash, mais c'est là que vous avez dit. Il convient de noter que tout mot, pas seulement fd fonctionnera entre les accolades, et qu'il attribue un fd> = 10.
Gregg Leventhal
3
@Scott, ce n'est pas seulement en bash, mais c'est seulement en bash 4.1 ou plus récent (donc non disponible sur les versions 3.2 encore utilisées sur MacOS).
Charles Duffy
2
@CharlesDuffy /dev/watchdogn'existe pas non plus sur Mac OS X; c'est un appareil spécifique à Linux.
duskwuff
11

La forme:

{var}<filename

fait le shell ouvrir le fichier filenamepour lire et stocker le numéro de descripteur de fichier dans une variable var. Il n'y a pas d'espace autorisé entre {var}et les opérateurs de redirection, et le numéro de descripteur de fichier sera supérieur ou égal 10.

Cette fonction était d' origine à partir ksh( à partir ksh93r version en 2006), a bashcopié beaucoup plus tard à bash-4.1-alphapartir de 2010. a zshégalement fait le changement plus tôt que bashd' zsh 4.3.4en 2007.

cuonglm
la source
2

Ceci est expliqué dans la section du manuel Bash sur les redirections .

Chaque redirection qui peut être précédée d'un numéro de descripteur de fichier peut à la place être précédée d'un mot de la forme { varname }. Dans ce cas, pour chaque opérateur de redirection à l'exception de >&-et <&-, le shell allouera un descripteur de fichier supérieur à 10 et l'affectera à { varname }. Si >&-ou <&-est précédé de { varname }, la valeur de varname définit le descripteur de fichier à fermer.

Barmar
la source