Я не понимаю команду удара exec
. Я видел, что это использовало внутренние сценарии для перенаправления всего вывода в файл (как замечено в этом). Но я не понимаю, как это работает или что это делает в целом. Я прочитал страницы справочника, но я не понимаю их.
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
команда я работал ранее.
Для понимания exec
, необходимо сначала понять fork
. Я пытаюсь сохранить его коротким.
, Когда Вы приходите к ветвлению на дороге, у Вас обычно есть две опции. Программы Linux достигают, это подцепляет дорогу на вилку, когда они совершают нападки fork()
системный вызов.
Нормальные программы являются системными командами, которые существуют в скомпилированной форме в Вашей системе. Когда такая программа выполнена, новый процесс создается. Этот дочерний процесс имеет ту же среду как свой родитель, только Идентификационный номер процесса отличается. Эту процедуру называют разветвление .
exec
используется. exec
заменит контент в настоящее время рабочего процесса с информацией от двоичного файла программы. В bash
, если Вы делаете help exec
:
$ help exec
exec: exec [-cl] [-a name] [command [arguments ...]] [redirection ...]
Replace the shell with the given command.
Execute COMMAND, replacing this shell with the specified program.
ARGUMENTS become the arguments to COMMAND. If COMMAND is not specified,
any redirections take effect in the current shell.
Options:
-a name pass NAME as the zeroth argument to COMMAND
-c execute COMMAND with an empty environment
-l place a dash in the zeroth argument to COMMAND
If the command cannot be executed, a non-interactive shell exits, unless
the shell option `execfail' is set.
Exit Status:
Returns success unless COMMAND is not found or a redirection error occurs.
соответствующий бит:
If COMMAND is not specified, any redirections take effect in the current shell.
exec
оболочка, встроенная , который является оболочкой, эквивалентной из exec
семья системные вызовы , что G_P говорит о (и чьи страницы справочника Вы, кажется, считали). Это просто имеет , POSIX передал под мандат функциональность влияния на текущую оболочку, если никакая команда не определяется.
exec
команда с двумя очень отличными поведениями, в зависимости от того, используется ли по крайней мере один аргумент с нею, или никакой аргумент не используется вообще.
Если по крайней мере один аргумент передается, первый взят в качестве названия команды и exec
попытайтесь выполнить его как команду, передающую остающиеся аргументы, если таковые имеются, к той команде и справляющуюся с перенаправлениями, если таковые имеются.
Если команда передала, поскольку первый аргумент не существует, текущая оболочка, не только исполнительная команда, выходит по ошибке.
Если команда существует и является исполняемым файлом, она заменяет текущую оболочку. Это означает это если exec
появляется в сценарии, инструкции после исполнительного вызова никогда не будут выполняться (если exec
находится самостоятельно в подоболочке). exec
никогда возвраты. Прерывания Shell как "ВЫХОД" не будут инициированы также.
Если никакой аргумент не передается, exec
только используется для переопределения текущих дескрипторов файлов оболочки. Оболочка продолжается после exec
, в отличие от этого, с предыдущим случаем, но стандартным входом, выводом, ошибкой или независимо от того, что дескриптор файла был перенаправлен, вступают в силу.
Если часть использования перенаправлений /dev/null
, любой вход от него возвратит EOF, и любой вывод к нему будет отброшен.
Можно закрыть дескрипторы файлов при помощи -
как источник или место назначения, например. exec <&-
. Последующее чтение или записи затем перестанут работать.
Вот два примера:
echo foo > /tmp/bar
exec < /tmp/bar # exec has no arguments, will only affect current shell descriptors, here stdin
cat # simple command that read stdin and write it to stdout
Этот сценарий произведет "нечто" как команду кошки, вместо того, чтобы ожидать ввода данных пользователем, поскольку это сделало бы в обычном случае, возьмет его вход из/tmp/bar файла, который содержит нечто.
echo foo > /tmp/bar
exec wc -c < /tmp/bar # exec has two arguments, the control flow will switch to the wc command
cat
Этот сценарий отобразится 4
(число байтов в/tmp/bar), и сразу заканчивается. cat
команда не будет выполняться.