Что делает “исполнительная” команда?

Я не понимаю команду удара exec. Я видел, что это использовало внутренние сценарии для перенаправления всего вывода в файл (как замечено в этом). Но я не понимаю, как это работает или что это делает в целом. Я прочитал страницы справочника, но я не понимаю их.

113
задан 31 August 2016 в 04:54

4 ответа

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 команда я работал ранее.

91
ответ дан 22 November 2019 в 22:59

Для понимания exec, необходимо сначала понять fork. Я пытаюсь сохранить его коротким.

  • , Когда Вы приходите к ветвлению на дороге, у Вас обычно есть две опции. Программы Linux достигают, это подцепляет дорогу на вилку, когда они совершают нападки fork() системный вызов.

  • Нормальные программы являются системными командами, которые существуют в скомпилированной форме в Вашей системе. Когда такая программа выполнена, новый процесс создается. Этот дочерний процесс имеет ту же среду как свой родитель, только Идентификационный номер процесса отличается. Эту процедуру называют разветвление .

  • Разветвление позволяет для существующего процесса запускать новый. Однако могут быть ситуации, где дочерний процесс не является частью той же программы как родительский процесс. В этом случае exec используется. exec заменит контент в настоящее время рабочего процесса с информацией от двоичного файла программы.
  • После процесса разветвления, адресное пространство дочернего процесса перезаписывается с новыми данными процесса. Это сделано через исполнительный вызов к системе.
33
ответ дан 22 November 2019 в 22:59

В 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 передал под мандат функциональность влияния на текущую оболочку, если никакая команда не определяется.

6
ответ дан 22 November 2019 в 22:59

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 команда не будет выполняться.

46
ответ дан 22 November 2019 в 22:59

Другие вопросы по тегам:

Похожие вопросы: