【发布时间】:2013-01-19 03:50:55
【问题描述】:
我一直认为子shell不是子进程,而是另一个 shell环境在同一进程中。
我使用了一组基本的内置插件:
(echo "Hello";read)
在另一个终端上:
ps -t pts/0
PID TTY TIME CMD
20104 pts/0 00:00:00 ksh
因此,kornShell (ksh) 中没有子进程。
输入 bash,给定相同的命令,它的行为似乎有所不同:
PID TTY TIME CMD
3458 pts/0 00:00:00 bash
20067 pts/0 00:00:00 bash
因此,bash 中的子进程。
通过阅读 bash 的手册页,很明显为子 shell 创建了另一个进程,
但是它伪造了$$,这很狡猾。
这是预期的 bash 和 ksh 之间的差异,还是我错误地阅读了症状?
编辑:附加信息:
在 bash 上运行 strace -f 并在 Linux 上运行 ksh 表明 bash 为示例命令调用了两次 clone(它不调用 fork)。所以 bash 可能正在使用线程(我试过 ltrace 但它核心转储了!)。
KornShell 既不调用fork、vfork,也不调用clone。
【问题讨论】:
标签: linux bash shell scripting ksh