Используйте exec
, когда вы хотите, чтобы процесс заменил себя на месте, вместо создания нового подпроцесса с собственным PID.
То есть этот код может создать two подпроцессов, сохраняя PID первого в $!
, но затем используя второй для выполнения process.sh
:
# store the subshell that runs cd in $!; not necessarily the shell that runs process.sh
# ...as the shell that runs cd is allowed to fork off a child and run process.sh there.
(cd "$dir" && bash process.sh) & pid=$!
... тогда как этот код создает только один подпроцесс, потому что он использует exec
, чтобы первый процесс заменил себя вторым:
# explicitly replace the shell that runs cd with the one that runs process.sh
# so $! is guaranteed to have the right thing
(cd "$dir" && exec bash process.sh) &