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