Bash:在函数调用

时间:2016-03-30 14:01:48

标签: linux bash shell

我有一个脚本,其中包含一些函数,这些函数在其他编程的开头加载以执行常见工作。为了避免重新处理,我尝试使用一些脚本范围变量创建某种缓存。所以这是我的问题:

假设我有这样的脚本:

functions.sh

#!/bin/bash
v_cache=

set_cache()
{
    v_cache=1
    echo 1
}
echo_cache()
{
    echo "v_cache=$v_cache"
}

test.sh

#!/bin/bash
. function.sh

var=`set_cache`
echo_cache

set_cache
echo_cache

这是输出:

$ ./test.sh 
v_cache=
1
v_cache=1

调用属性中的函数(使用` func `或$( func ))与简单调用具有不同的上下文。我需要在同一个脚本中保持相同的范围到所有函数调用(例如 test.sh )。

对于上面的示例,我期望的输出是:

$ ./test.sh 
v_cache=1
1
v_cache=1

我试图找到一些解释为什么它以这种方式工作,但却找不到任何东西。我认为``触发一个新的 bash 执行,完全独立。

有通过所有函数调用共享变量的方法吗?绕过这种行为有哪些替代方案?

2 个答案:

答案 0 :(得分:1)

“意外”行为是因为在这一行用``或$()创建了子shell。

var=`set_cache`

当子shell开始时,它会创建它自己的变量v_cache,将其设置为1,并将echo 1返回到父shell中的set var。然后子shell退出,你回显v_cache(oringal / parent shell),这是未设置的。

有不同的思路与功能,从我的背景和语言,你不应该使用函数来改变全局,你应该让它返回一个全局值。在这种情况下,将var更改为v_cache。其他人(他的背景必须与我不同)认为这是bash的短暂出现。

答案 1 :(得分:0)

如果在test.sh中通过./function.sh调用function.sh,则会启动子shell来运行funtion.sh,因此变量值不会保存在test.sh运行的shell中。

你应该通过 source ./function.sh 调用function.sh来在同一个shell中运行它们。