¿Qué hace 'exec {fd} </ dev / watchdog' en Bash?

28

Eso es literal, {fd}no es un marcador de posición. Tengo un script que hace esto, y no se basa en nada, ni hace referencia a {fd} en ningún otro lugar. ¿Es válido este bash?

exec {fd}</dev/watchdog

Gregg Leventhal
fuente

Respuestas:

34

En lugar de tener que elegir un descriptor de archivo y esperar que esté disponible:

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

Esta notación le pide al shell que elija un descriptor de archivo que no esté actualmente en uso, abra el archivo para leer en ese descriptor y asigne el número a la variable dada ( fd).

$ exec {fd}< /dev/watchdog
$ echo $fd
10
chepner
fuente
Estoy seguro de que tienes razón, porque (1) recuerdo haberlo leído en alguna parte, y (2) lo intenté (y funciona). Pero no pude encontrarlo documentado en ninguna parte. (Por supuesto, tenía menos de diez minutos para buscar antes de publicar su respuesta). ¿Puede proporcionar una referencia de dónde está documentado?
Scott
2
Consulte la página de manual, segundo párrafo de la sección REDIRECTIONS. Realmente no te llama la atención, ya que no dan un ejemplo explícito.
chepner
Tienes razón, lo extrañé en man bash, pero es allí donde dijiste. Cabe señalar que cualquier palabra, no solo fd funcionará entre llaves, y que asigna un fd> = 10.
Gregg Leventhal
3
@Scott, no solo está en bash, sino que también está en bash 4.1 o más reciente (por lo tanto, no está disponible en las versiones 3.2 que todavía se usan en MacOS).
Charles Duffy
2
Sin /dev/watchdogembargo, @CharlesDuffy tampoco existe en Mac OS X; Es un dispositivo específico de Linux.
duskwuff
11

La forma:

{var}<filename

hecho que el archivo de shell filenamepara la lectura y el archivo de almacenamiento de número de descriptor en la variable var. No hay espacio permitido entre los {var}operadores de redirección y, y el número de descriptor de archivo será mayor o igual 10.

Esta característica era original del ksh(de la versión ksh93r en 2006), bashlo copió mucho más tarde en la bash-4.1-alphade 2010. zshTambién hizo el cambio antes de lo que basha partir zsh 4.3.4de 2007.

Cuonglm
fuente
2

Esto se explica en la sección del manual de Bash sobre redirecciones .

Cada redirección que puede estar precedida por un número de descriptor de archivo puede ir precedida por una palabra de la forma { varname }. En este caso, para cada operador de redirección excepto >&-y <&-, el shell asignará un descriptor de archivo mayor que 10 y lo asignará a { varname }. Si >&-o <&-va precedido por { varname }, el valor de varname define el descriptor de archivo para cerrar.

Barmar
fuente