No formulário 'exec FD' do exec

3

Não consigo encontrar nada na página zsh man explicando exatamente o que o seguinte (por exemplo) faz

exec 3> /tmp/foo

Toda a documentação apropriada que eu posso encontrar para exec refere-se à forma em que exec é seguido por um "comando simples". (Veja, por exemplo, man zshbuiltins e man zshmisc .) (A forma exec FD> é mencionada brevemente em man zshmisc , mas em uma passagem que me parece pressupor que essa forma foi documentada completa e adequadamente em outro lugar.

Eu olhei todos os hits produzidos por

man zshall | grep -P '\bexec\b'

... mas nenhum era o que eu procurava.

Alguém sabe de um bom substituto para a documentação em falta?

PS: Uma possível explicação para o que me parece "documentação ausente" é que formulários como exec 3> /tmp/foo são, na verdade, casos especiais do formulário " exec comando simples ". Se isto é assim, no entanto, eu gostaria de encontrar documentação que explica (1) como, por exemplo, 3> /tmp/foo é um comando simples (se eu executar este "comando simples" na linha de comando, ele apenas trava até eu acertar %código%); e (2) porque o código em um script acontece depois que algo como ^C é avaliado, enquanto isso acontece depois, digamos, de exec 3> /tmp/foo .

    
por kjo 01.11.2016 / 10:12

1 resposta

2

Os significados de exec com e sem um comando não estão relacionados. Eu acho que o nome embutido está sobrecarregado porque um significado não faz sentido com um comando e o outro não faz sentido sem um comando, então fazendo assim poupado tendo que inventar um novo nome que então não seria utilizável por outro comando.

O manual afirma:

If command is omitted but any redirections are specified, then the redirections will take effect in the current shell.

O que isto significa é que algo como exec 3> /tmp/foo altera para qual descritor de arquivo 3 aponta no processo de execução do shell. Um fragmento de shell como /bin/somecommand 3>/tmp/foo significa o seguinte:

  1. Crie um subprocesso.
  2. Abra /tmp/foo para escrever no descritor de arquivo 3 no subprocesso.
  3. Execute o arquivo /bin/somecommand no subprocesso.

exec 3>/tmp/foo apenas executa a etapa 3, não faz nada sobre processos.

Após exec 3>/tmp/foo , todos os acessos subseqüentes ao descritor de arquivos 3 do shell e seus subprocessos vão para /tmp/foo , como acontece com qualquer outro redirecionamento. Por exemplo, suponha que você execute o seguinte script em um terminal sem nada conectado ao descritor de arquivo 3:

echo hello           # prints to the terminal
echo nope >&3        # complains about a bad descriptor since no file is open on fd 3
exec >/tmp/out 3>/tmp/three
echo hello           # writes to /tmp/out
echo howdy >&3       # writes to /tmp/three
echo wibble >&3      # writes a second line to /tmp/three
    
por 02.11.2016 / 01:50