下列哪些代码会在当前shell的同一个进程中运行

下列哪些代码会在当前shell的同一个进程中运行

A。{ echo "Hello World"; } >outputfile

B.( echo "Hello World" ) >outputfile

C。./anothershell.sh

D ./bin/echo "Hello World"

哪个是对的?以及当前shell的同一个进程中可以运行什么样的命令?

答案1

只有 A 会在当前 shell 的进程内运行。

B 将在子 shell 中运行,因为您通过使用 paranehteses 请求了子 shell。

C 和 D 都将在当前 shell 进程之外运行,因为它们是外部命令的调用。

答案2

您已经多次询问如何证明这一点。您使用环境变量设置作为探针:

export testvar=nope
{ echo "Hello World"; export testvar=yep; } >outputfile
printenv testvar

yep

export testvar=nope
( echo "Hello World"; export testvar=yep; ) >outputfile
printenv testvar

nope

您需要在 (C) 中编辑脚本并为 (D) 编译修改后的 echo,但随后它们的相应构造也将写入nope.这明确表明只有情况 (A) 和评论中的 Glennjackman 案例 (E)在同一进程中运行。

答案3

您可能会忽略的一个区别是 B 将分叉(因此它是另一个进程),但它实际上并不执行(它是同一 shell 的副本,它不会去查找 /bin/sh 并重新运行初始化程序ETC)。并且有特殊的规则(例如,$$ 是原始 shell 的 pid)。

相关内容