在 shell 函数和环境变量的作用域中声明



请考虑以下测试片段(这些是文件'extare_test'的内容(:

function do_foobar ()
{
  unset FOOBAR
  declare -- FOOBAR="default"
  FOOBAR="override"
  echo "At end of do_foobar: FOOBAR = "$FOOBAR""
}

从命令提示符中运行do_foobar在:

中导致
$ source declare_test
$ do_foobar
At end of do_foobar: FOOBAR = "override"
$ echo "FOOBAR="$FOOBAR""
FOOBAR=""

换句话说,foobar内部的期望值,即"覆盖",但在函数后立即是 unset

如果我们更改do_foobar并删除"声明"行,则结果是:

$ do_foobar
At end of do_foobar: FOOBAR = "override"
$ echo "FOOBAR="$FOOBAR""
FOOBAR="override"

所以,现在的富巴不是不设置的。请注意,已删除的声明的功能是 set foobar。如果我们没有删除声明,我们将删除" foobar ="覆盖"行,则结果变为:

$ do_foobar
At end of do_foobar: FOOBAR = "default"
$ echo "FOOBAR="$FOOBAR""
FOOBAR=""

所以,fuobar在功能之后仍然无法设置。

最后,如果您仅删除未设定的foobar,请在调用do_foobar之前给Foobar一些值,然后结果是Foobar没有变化!因此,尽管有声明行,但" unset" 确实在功能之后效果,但是声明自己和随后的其他作业不再是因为声明。

这对我来说是一个问题,因为我想通过提示_command调用shell函数,该函数通过采购由'nectare -p'生成的文件来恢复我的环境(已存在一长串声明命令列表(。显然,Bash不允许在功能中使用声明,而它确实允许直接设置变量。

这不是一个错误吗?它在以后版本的Bash中固定吗?(我有4.3.48(是否有解决此问题的解决方法,不需要我更改要源的文件(即,该文件存在于声明命令的文件,我想以这种方式保留它(。

declare限制了函数内部变量的范围,类似于 local的作用。如果要覆盖范围,请使用-g

#!/bin/bash
function do_foobar ()
{
    unset FOOBAR
    declare -g FOOBAR="default"
    FOOBAR="override"
    echo "At end of do_foobar: FOOBAR = "$FOOBAR""
}

$ source test.sh
$ do_foobar
At end of do_foobar: FOOBAR = "override"
$ echo "$FOOBAR"
override

最新更新