2017-01-12 2 views
2

После прочтения explanations of how the exec builtin works in bash, я понимаю, что его основной функцией является замена текущего процесса без наложения. Он также, по-видимому, используется для перенаправления ввода-вывода и закрытия дескрипторов файлов в текущем процессе, что меня смущает. Это какая-то не связанная дополнительная вещь exec? Можно ли это понимать в контексте «замены текущего процесса»? И как это работает в сочетании с замещением процесса, например. exec 3< <(my program)?Понимание exec в bash

ответ

6

Вот что делает exec:

  1. Установите все переназначения в текущем процессе.
    • Это сочетание open, dup2 и close системных вызовов для большинства операций, как > foo
    • pipe + fork + /dev/fd/* используется для процесса substition
    • Временные файлы создаются и открыты для здесь-документов и здесь- строки
  2. Заменить образ процесса (используя execve) с указанной программой, , если они есть

Если вы не укажете программу для запуска, шаг 2 просто пропущен, и поэтому все переадресации влияют на остальную часть скрипта.

<(Process substitution) работ pipe + fork + /dev/fd/:

  1. Создать трубу в обычном режиме.
  2. Скопируйте его в FD 63 или где-нибудь его не будет
  3. Вилка и запуск программы, которая читает/записывает в трубу.
  4. Замените замену процесса на /dev/fd/63, специальный файл, который будет возвращать FD 63 при открытии. (попробуйте echo <(ls)).

С этого момента он работает так же, как перенаправление из любого другого файла. Вы открываете /dev/fd/63 для чтения на FD 3, а затем вы заканчиваете чтение из трубы. exec поэтому не нужно ничего делать особый.

+0

@Kvass: Если вы заинтересованы в том, как работает подстановка процесса под обложками, файл исходного кода является 'subst.c', а функция' process_substitute', есть немало комментариев. Строка 5049 здесь: http://code.metager.de/source/xref/gnu/bash/subst.c – cdarke

Смежные вопросы