在Advanced Bash-Scripting Guide 中,在示例 27-4 中,从底部起第 7 行,我读到了这个:
函数作为子进程运行。
我用Bash做了一个测试,好像上面的说法是错误的。
在这个网站上的搜索、Bash Man 和我的搜索引擎都没有带来任何好处。
你有答案并愿意解释吗?
Ant*_*gan 43
Advanced Bash-Scripting Guide 并不总是可靠的,其示例脚本包含过时的实践,例如使用有效弃用的反引号进行命令替换,即,`command`而不是$(command).
在这种特殊情况下,这是明显不正确的。
(规范的)Bash 手册中有关Shell 函数的部分明确指出
Shell 函数在当前 Shell 上下文中执行;没有创建新的过程来解释它们。
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 中)。
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 指南的慈善,他们显然打算写的是该函数在命令替换内运行,而命令替换内的命令在subshell 中运行。
| 归档时间: |
|
| 查看次数: |
14555 次 |
| 最近记录: |