Na forma `exec FD>` de exec

Na forma `exec FD>` de exec

Não consigo encontrar nada na zshpágina de manual explicando exatamente o que o seguinte (por exemplo) faz

exec 3> /tmp/foo

Toda a documentação adequada que posso encontrar execrefere-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/foosã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 datenão.

Responder1

Os significados de execcom 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/fooaltera o que o descritor de arquivo 3 aponta no processo de shell em execução. Um snippet de shell como /bin/somecommand 3>/tmp/foosignifica o seguinte:

  1. Crie um subprocesso.
  2. Aberto /tmp/foopara escrita no descritor de arquivo 3 no subprocesso.
  3. Execute o arquivo /bin/somecommandno subprocesso.

exec 3>/tmp/fooapenas 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

informação relacionada