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)。