man bash
dice:
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.
Las dos últimas líneas son lo importante: si se ejecuta exec
solo, sin un comando, simplemente hará que las redirecciones se apliquen al shell actual. Probablemente sepa que cuando ejecuta command > file
, la salida de command
se escribe en file
lugar de en su terminal (esto se llama redirección ). Si ejecuta en su exec > file
lugar, la redirección se aplica a todo el shell: cualquier salida producida por el shell se escribe en file
lugar de a su terminal. Por ejemplo 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
Primero comienzo un nuevo bash
shell. Luego, en este nuevo shell ejecuto exec > file
, de modo que toda la salida se redirige a file
. De hecho, después de eso ejecuto date
pero no obtengo salida, porque la salida se redirige a file
. Luego salgo de mi shell (para que la redirección ya no se aplique) y veo que de file
hecho contiene el resultado del date
comando que ejecuté anteriormente.