man bash
dit:
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.
Ce qui est important, ce sont les deux dernières lignes: si vous exécutez tout exec
seul, sans commande, les redirections s’appliqueront simplement au shell actuel. Vous savez probablement que lorsque vous exécutez command > file
, la sortie de command
est écrite au file
lieu de sur votre terminal (on parle de redirection ). Si vous l'exécutez à la exec > file
place, la redirection s'applique à l'ensemble du shell: toute sortie produite par le shell est écrite au file
lieu de sur votre terminal. Par exemple ici
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
Je commence d'abord un nouveau bash
shell. Ensuite, dans ce nouveau shell, je lance exec > file
, de sorte que toutes les sorties soient redirigées file
. En effet, après cela, je cours date
mais je n’obtiens aucune sortie, car la sortie est redirigée vers file
. Ensuite, je quitte mon shell (pour que la redirection ne s'applique plus) et je constate que file
contient effectivement le résultat de la date
commande que j'ai exécutée précédemment.