Описание exec в bash

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

Ответ 1

Здесь exec:

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

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

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

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

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