После чтения объяснений того, как встроенный exec работает в bash, я понимаю, что его основной функцией является замена текущего процесса без наложения. Он также, по-видимому, используется для перенаправления ввода-вывода и закрытия дескрипторов файлов в текущем процессе, что меня смущает. Это какая-то не связанная дополнительная вещь exec? Можно ли это понимать в контексте "замены текущего процесса"? И как это работает в сочетании с замещением процесса, например. exec 3< <(my program)?
Описание exec в bash
Ответ 1
Здесь exec:
- Настройте все перенаправления в текущем процессе.
- Это сочетание
open,dup2иclosesyscalls для большинства операций, таких как> 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 поэтому не нужно ничего особенного делать.