范围问题?-在 bash 函数内部的源块中,变量声明丢失

范围问题?-在 bash 函数内部的源块中,变量声明丢失

面临一个我找不到答案的问题。为了举例,我将问题简化为更简单的版本:

我有一个名为的文件datasource,其内容如下:

$ cat datasource
declare X="Hello, world"
$

函数 foo 声明为:

$ function foo( ) {
  . ./datasource
}

当我从当前上下文中获取数据源时,X 被声明;当我通过 foo 执行此操作时,则没有。

$ # next result is expected
$ unset X
$ declare -p X
bash: declare: X: not found
$
$ # next result is expected
$ . ./datasource
$ declare -p X
declare -- X="Hello, world"
$
$ # next result is NOT expected
$ unset X
$ foo
$ declare -p X
bash: declare: X: not found
$

知道为什么吗?

我正在运行 Ubuntu LTS 18.04 和 bash 5.0.17

答案1

您需要使用declare -g来使变量成为全局变量。help declare说:

在函数中使用时,宣布使 NAME 本地化,就像当地的 命令。此-g选项可抑制此行为。

相关内容