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

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

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.


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.

Ao utilizar nosso site, você reconhece que leu e compreendeu nossa Política de Cookies e nossa Política de Privacidade.
Licensed under cc by-sa 3.0 with attribution required.