Não consigo encontrar nada na zsh
página de manual explicando exatamente o que o seguinte (por exemplo) faz
exec 3> /tmp/foo
Toda a documentação adequada que posso encontrar exec
refere-se à forma em que exec
é seguida por um "comando simples". (Por exemplo, vejaman zshbuiltins
, eman zshmisc
.) (O exec FD>
formulário é mencionado brevemente emman zshmisc
, mas em uma passagem que me parece assume que esta forma foi completa e adequadamente documentada 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 conhece um bom substituto para a documentação faltante?
PS: Uma possível explicação para o que me parece "documentação faltante" é que formulários como exec 3> /tmp/foo
são na verdade casos especiais do formulário "exec
comando simples". Se for assim, no entanto, gostaria de encontrar documentação que explique (1) como, por exemplo, 3> /tmp/foo
é um comando simples (se eu executar este "comando simples" na linha de comando, ele simplesmente trava até eu acertar ^C
) ; e (2) por que o código em um script acontece depois que algo como exec 3> /tmp/foo
é avaliado, enquanto o que acontece depois, digamos, exec date
não.
Responder1
Os significados de exec
com e sem comando não estão relacionados. Eu acho que o nome interno está sobrecarregado porque um significado não faz sentido com um comando e o outro não faz sentido sem um comando, então fazer desta forma evitou ter que inventar um novo nome que não seria utilizável para outro comando.
Omanualafirma:
Secomandofor omitido, mas quaisquer redirecionamentos forem especificados, os redirecionamentos entrarão em vigor no shell atual.
O que isso significa é que algo como exec 3> /tmp/foo
altera o que o descritor de arquivo 3 aponta no processo de shell em execução. Um snippet de shell como /bin/somecommand 3>/tmp/foo
significa o seguinte:
- Crie um subprocesso.
- Aberto
/tmp/foo
para escrita no descritor de arquivo 3 no subprocesso. - Execute o arquivo
/bin/somecommand
no subprocesso.
exec 3>/tmp/foo
apenas executa a etapa 3, não faz nada sobre os processos.
Depois exec 3>/tmp/foo
, todos os acessos subsequentes ao descritor de arquivo 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