Что делает & ldquo; exec & rdquo; команда делает?

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

1
задан 31 August 2016 в 14:54

3 ответа

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

Когда вы приходите к развилке на дороге, у вас обычно есть два варианта. Программы Linux достигают этой развилки на дороге, когда они нажимают на системный вызов fork(). Обычные программы - это системные команды, которые существуют в скомпилированной форме в вашей системе. Когда такая программа выполняется, создается новый процесс. Этот дочерний процесс имеет ту же среду, что и его родительский, только идентификатор процесса отличается. Эта процедура называется forking. Викинг обеспечивает способ для существующего процесса начать новый. Однако могут быть ситуации, когда дочерний процесс не является частью той же программы, что и родительский процесс. В этом случае используется exec. exec заменит содержимое текущего процесса информацией из двоичного файла программы. После процесса наложения адресное пространство дочернего процесса перезаписывается новыми данными процесса. Это делается путем вызова exec в систему.
22
ответ дан 24 May 2018 в 03:35
  • 1
    вы можете объяснить, почему exec может перенаправить вывод сценария, как в ссылке, которую я опубликовал? – becko 19 September 2014 в 02:45

exec - это команда с двумя очень разными поведением, в зависимости от того, используется ли с ней по крайней мере один аргумент или вообще не используется аргумент.

Если хотя бы один аргумент передан, первый из них берется как имя команды, а exec пытается выполнить его как команду, передающую оставшиеся аргументы, если таковые имеются, в эту команду и управление перенаправлениями, если таковые имеются. Если команда, переданная как первый аргумент, не существует, текущая оболочка, а не только команда exec, выходит с ошибкой. Если команда существует и является исполняемой, она заменяет текущую оболочку. Это означает, что если exec появляется в скрипте, инструкции, следующие за вызовом exec, никогда не будут выполняться (если только exec не находится в подоболочке). exec никогда не возвращается. Если аргумент не передан, exec используется только для переопределения дескрипторов файла оболочки. Оболочка продолжается после exec, в отличие от предыдущего случая, но вступили в силу стандартный ввод, вывод, ошибка или любой файл-дескриптор файла. Если в некоторых перераспределениях используется /dev/null, любой вход из него вернет EOF, и любой вывод на него будет отброшен. Вы можете закрыть файловые дескрипторы, используя - в качестве источника или адресата, например. [F12]. Последующие чтения или записи будут терпеть неудачу.

Вот два примера:

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

Этот скрипт выведет «foo» в качестве команды cat, вместо того, чтобы ждать ввода пользователя, как это было бы в обычном случае, будет возьмите свой вход из файла / tmp / bar, который содержит foo.

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

17
ответ дан 24 May 2018 в 03:35
  • 1
    `Некоторые старые сообщения никогда не стареют ... +1. – Cbhihe 23 March 2017 в 15:33
  • 2
    Если в некоторых перераспределениях используется / dev / null, связанный файловый дескриптор закрывается. Нет, он действительно перенаправляет на / из /dev/null, поэтому записи все еще преуспевают и читают возврат EOF. close(2) на fd вызовет системные вызовы чтения / записи, чтобы возвращать ошибки, и вы делаете это с помощью exec 2>&-, например. – Peter Cordes 7 July 2017 в 05:59
  • 3
    Попробуйте сами: exec 3</dev/null; ls -l /proc/self/fd: обратите внимание, что fd 3 будет открыто только для чтения / dev / null. Затем закройте его снова с помощью exec 3<&-, и вы увидите (с ls -l /proc/$$/fd снова), что ваш процесс оболочки не имеет fd 3. (закрытие stdin с exec <&- может быть полезно в скриптах, но в интерактивном режиме это выход из системы). – Peter Cordes 7 July 2017 в 06:01
  • 4
    @PeterCordes Вы абсолютно правы. Ответ обновлен. Благодаря! – jlliagre 7 July 2017 в 08:43

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

3
ответ дан 24 May 2018 в 03:35

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

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