函数在 Bash 中作为子进程运行吗?

33 bash process function

Advanced Bash-Scripting Guide 中,在示例 27-4 中,从底部起第 7 行,我读到了这个:

函数作为子进程运行。

我用Bash做了一个测试,好像上面的说法是错误的。

在这个网站上的搜索、Bash Man 和我的搜索引擎都没有带来任何好处。

你有答案并愿意解释吗?

Ant*_*gan 43

Advanced Bash-Scripting Guide 并不总是可靠的,其示例脚本包含过时的实践,例如使用有效弃用的反引号进行命令替换,即,`command`而不是$(command).

在这种特殊情况下,这是明显不正确的。

(规范的)Bash 手册中有关Shell 函数的部分明确指出

Shell 函数在当前 Shell 上下文中执行;没有创建新的过程来解释它们。

  • _“高级 Bash 脚本指南通常不可靠”_ 非常正确。 (13认同)
  • @WillVousden 这里的参考文件是什么样的?一堆指南技术缺陷的例子?bash 社区的专家先前指出它不可靠的文档?如果在 bash 中拥有金牌徽章的 stackoverflow 成员在评论中表示同意,这会有所帮助吗?:p (6认同)
  • @WillVousden 我不认为你想要的东西本身以可靠的形式存在。Mendel Cooper 过去曾更新并修复了该指南的问题,但没有公开的错误跟踪器或勘误表。(也许这是我能做出的最严厉的声明。)因此,当我们发现缺陷(感知的或真实的)时,我们所能做的就是给作者发电子邮件并希望最好。 (3认同)
  • @WillVousden,...如果您想了解 freenode #bash 频道中关于应该避免使用 ABS 的共识有多长时间的*历史*,请参阅 http://wooledge.org/~greybot/meta/abs --每行的第二个字段是时间戳,第一个是用户名;我希望有关用户名是非常受人尊敬的个人的断言就足够了。 (3认同)
  • 你能提供参考文献来支持你的第一句话吗? (2认同)

PSk*_*cik 41

花括号函数将在调用 shell 进程中运行,除非它们需要自己的子 shell,即:

  • 当你在后台运行它们时 &
  • 当您将它们作为管道中的链接运行时

重定向或额外的环境。变量不会强制一个新的子shell:

hw(){
    echo hello world from $BASHPID
    echo var=$var
} 
var=42 hw >&2
echo $BASHPID  #unexports var=42 and restores stdout here
Run Code Online (Sandbox Code Playgroud)

如果您使用括号而不是花括号定义函数:

hw()(
  echo hello world from $BASHPID
)
hw 
echo $BASHPID
Run Code Online (Sandbox Code Playgroud)

它将始终在新进程中运行。

命令替换$()也总是在 bash 中创建进程(但如果你在其中运行内置程序,则不在 ksh 中)。

  • 注意 bash 函数接受任何复合命令,因此 `foo() [[ x = x ]]` 也是一个有效的函数定义。然而,如果你查看带有 `type foo` 的函数,你会发现这仍然是 `foo() { [[ x = x ]]; 的语法糖。}`。子shell函数也是如此:`bar() ( : )`变成了`bar() { ( : ); }`。 (11认同)
  • 这是我马上想到的答案,而且绝对正确。它应该被选为正确答案。`f()(...)` 总是执行自己的 shell,而 `f(){...}` 不会。 (2认同)

Joh*_*024 10

该示例中的相关命令如下所示:

echo ${arrayZ[@]/%e/$(replacement)}
Run Code Online (Sandbox Code Playgroud)

后面的例子说明:

#    $( ... ) is command substitution.
#    A function runs as a sub-process.
Run Code Online (Sandbox Code Playgroud)

作为对 ABS 指南的慈善,他们显然打算写的是该函数在命令替换内运行,而命令替换内的命令在subshel​​l 中运行。

  • @tomas _“非常具有误导性。”_ 是的,非常。与 ABS 指南相比,[Greg 的 Wiki](http://mywiki.wooledge.org/) 是高级 bash 信息的极好来源。 (5认同)
  • @tomas,...我对 bash-hackers wiki 的看法是它是一个很好的来源。我没有像 Wooledge wiki 那样全面地阅读它,但它往往是准确和精确的。 (2认同)