gpt4 book ai didi

bash - bash 中的局部变量 : local vs subshell

转载 作者:行者123 更新时间:2023-11-29 08:53:21 26 4
gpt4 key购买 nike

据我所知,有两种方法可以在 bash 函数中创建局部变量:创建子 shell 或将每个变量声明为局部变量。

例如:

# using local
function foo
{
local count
for count in $(seq 10)
do
echo $count
done
}

# using subshell
function foo
{
(
for count in $(seq 10)
do
echo $count
done
)
}

显然,使用子 shell 的版本更易于编写,因为您不必关心将所有变量声明为本地变量(更不用说由 getopts 等工具创建/导出的(环境)变量)。但我可以想象创建子 shell 会产生开销。

那么更好的方法是什么?优点/缺点是什么?

最佳答案

创建子 shell 涉及 fork(),因此与局部变量相比,它肯定有开销。虽然子 shell 很便宜——当你需要一个时你不必担心它们的成本——它们不是免费的。

如果您的脚本将被大量使用并且性能确实很重要(因此您将有数百名用户同时运行它,一天多次),那么您可能会担心子程序的性能成本-壳。 OTOH,如果您每月运行一次并且整个脚本运行时间不到 10 秒,您可能不会这样做。

然而,就清晰度而言,显式声明变量要好得多——它降低了脚本中断的风险,因为有人走过来说“这个子 shell 显然不需要”(而且它真的不是;我想从您的函数中删除子 shell)。

看看 Perl 脚本的演变。他们开始时是免费的,变量按需出现。他们逐渐变得更加严格,现在的正常风格是预先声明所有变量。在某种程度上,shell 遵循了类似的路径——但不像 Perl 那样严格。 Awk 也是一个有趣的案例研究;它的函数使用全局变量,除非它们是函数的参数,这导致编写函数时使用 3 个事件参数(比如说)和 5 个有效定义局部变量的非事件参数。尽管它“有效”,但它有点古怪。

关于bash - bash 中的局部变量 : local vs subshell,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/4625309/

26 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com