我运行了一些测试,看看bash -c
如何为给定的命令生成子进程,并注意到一些奇怪的行为。
test.sh
的内容:
#!/usr/bin/env fish
echo $fish_pid
readlink /proc/$fish_pid/exe
实验结果如下:
$ bash -c 'echo $$ && ./test.sh'
296
296
/usr/bin/fish
$ bash -c 'echo $$ && ./test.sh && echo $$'
403
404
/usr/bin/fish
403
$ bash -c 'echo $$; ./test.sh'
317
318
/usr/bin/fish
$ bash -c 'echo $$; exec ./test.sh'
349
349
/usr/bin/fish
这几乎就像bash通过在第一种情况下自动插入exec
来进行尾部调用优化。这是怎么回事?
正是你所描述的;Bash注意到它可以重用当前进程,因此避免执行fork()
系统调用,然后在exec()
系统调用足够时等待子进程。
不清楚为什么在第三种情况下没有这样做;这一点似乎和第一个一样明确,甚至更明确。