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:
- Crie um subprocesso.
- Abra
/tmp/foo
para escrever 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 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