O que 'exec {fd} </ dev / watchdog' faz no Bash

28

Isso é literal, {fd}não é um espaço reservado. Eu tenho um script que faz isso e não gera nada, nem faz referência a {fd} em nenhum outro lugar. Isso é válido?

exec {fd}</dev/watchdog

Gregg Leventhal
fonte

Respostas:

34

Em vez de precisar escolher um descritor de arquivo e torcer para que ele esteja disponível:

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

essa notação solicita que o shell escolha um descritor de arquivo que não esteja em uso no momento, abra o arquivo para leitura nesse descritor e atribua o número à variável especificada ( fd).

$ exec {fd}< /dev/watchdog
$ echo $fd
10
chepner
fonte
Tenho certeza de que você está certo, porque (1) eu lembro de ter lido em algum lugar e (2) eu apenas tentei (e funciona). Mas não consegui encontrá-lo documentado em nenhum lugar. (Obviamente, eu tinha menos de dez minutos para pesquisar antes de postar sua resposta.) Você pode fornecer uma referência para onde está documentada?
Scott
2
Veja a página de manual, segundo parágrafo da seção REDIRECTIONS. Na verdade, isso não desperta em você, pois eles não dão um exemplo explícito.
Chepner 28/08/2015
Você está certo, eu perdi isso na festa do homem, mas é lá onde você disse. Deve-se notar que qualquer palavra, e não apenas fd vai funcionar nas chaves, e que atribui um fd> = 10.
Gregg Leventhal
3
@ Scott, não é apenas no bash, mas apenas no bash 4.1 ou mais recente (portanto, não está disponível nas versões 3.2 ainda usadas no MacOS).
Charles Duffy
2
O @CharlesDuffy /dev/watchdogtambém não existe no Mac OS X; é um dispositivo específico do Linux.
precisa saber é o seguinte
11

A forma:

{var}<filename

fez o arquivo aberto shell filenamepara leitura e arquivo de armazenamento número do descritor na variável var. Não há espaço permitido entre {var}operadores de redirecionamento e e o número do descritor de arquivo será maior ou igual 10.

Esse recurso era original ksh(da versão ksh93r em 2006), bashcopiado muito mais tarde em bash-4.1-alpha2010. zshTambém fez a alteração antes bashde zsh 4.3.42007.

cuonglm
fonte
2

Isso é explicado na seção do manual Bash, em Redirecionamentos .

Cada redirecionamento que pode ser precedido por um número de descritor de arquivo pode ser precedido por uma palavra no formato { varname }. Nesse caso, para cada operador de redirecionamento, exceto >&-e <&-, o shell alocará um descritor de arquivo maior que 10 e o atribuirá a { varname }. Se >&-ou <&-for precedido por { varname }, o valor de varname definirá o descritor de arquivo a ser fechado.

Barmar
fonte