man bash
говорит:
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.
Последние две строки - вот что важно: если вы запустите exec
сам, без команды, это просто заставит перенаправления применяться к текущей оболочке. Вы, вероятно, знаете, что когда вы запускаете command > file
, вывод command
записывается file
вместо вашего терминала (это называется перенаправлением ). Если вы запускаете exec > file
вместо этого, то перенаправление применяется ко всей оболочке: любой вывод, произведенный оболочкой, записывается file
вместо вашего терминала. Например здесь
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
Я сначала запускаю новую bash
оболочку. Затем в этой новой оболочке я запускаю exec > file
, так что весь вывод перенаправляется в file
. Действительно, после этого я бегу, date
но я не получаю вывод, потому что вывод перенаправлен в file
. Затем я выхожу из своей оболочки (так что перенаправление больше не применяется), и я вижу, что file
действительно содержит вывод date
команды, которую я выполнил ранее.