man bash
diz:
exec [-cl] [-a name] [command [arguments]]
If command is specified, it replaces the shell. No new process
is created. The arguments become the arguments to command. If
the -l option is supplied, the shell places a dash at the
beginning of the zeroth argument passed to command. This is
what login(1) does. The -c option causes command to be executed
with an empty environment. If -a is supplied, the shell passes
name as the zeroth argument to the executed command. If command
cannot be executed for some reason, a non-interactive shell
exits, unless the execfail shell option is enabled. In that
case, it returns failure. An interactive shell returns failure
if the file cannot be executed. If command is not specified,
any redirections take effect in the current shell, and the
return status is 0. If there is a redirection error, the return
status is 1.
As duas últimas linhas são importantes: se você executar exec
sozinho, sem um comando, ele simplesmente fará com que os redirecionamentos se apliquem ao shell atual. Você provavelmente sabe que quando você executa command > file
, a saída de command
é gravada em file
em vez de no seu terminal (isso é chamado de redirecionamento ). Se você executar exec > file
, o redirecionamento será aplicado ao shell inteiro: Qualquer saída produzida pelo shell será gravada em file
em vez de no seu terminal. Por exemplo aqui
bash-3.2$ bash
bash-3.2$ exec > file
bash-3.2$ date
bash-3.2$ exit
bash-3.2$ cat file
Thu 18 Sep 2014 23:56:25 CEST
Primeiramente, inicio um novo shell bash
. Então, neste novo shell eu corro exec > file
, de modo que toda saída seja redirecionada para file
. De fato, depois disso eu corro date
mas não recebo saída, porque a saída é redirecionada para file
. Em seguida, saio do shell (para que o redirecionamento não se aplique mais) e vejo que file
contém a saída do comando date
que executei anteriormente.