![哪些 shell 具有“local”不会更改子进程的导出变量的函数?](https://linux22.com/image/86410/%E5%93%AA%E4%BA%9B%20shell%20%E5%85%B7%E6%9C%89%E2%80%9Clocal%E2%80%9D%E4%B8%8D%E4%BC%9A%E6%9B%B4%E6%94%B9%E5%AD%90%E8%BF%9B%E7%A8%8B%E7%9A%84%E5%AF%BC%E5%87%BA%E5%8F%98%E9%87%8F%E7%9A%84%E5%87%BD%E6%95%B0%EF%BC%9F.png)
在下面的示例中,像在函数中export
一样重新设置 ed 变量 。 local
Bash、Zsh、Fish 不会将原始值传递给子进程。是否有任何 shelllocal
只影响本地函数体,但将原始export
ed 值传递给子进程?
function the_func {
local MY_VAR="new value"
echo "=== $MY_VAR" # === prints "new value"
my -child -process # === gets MY_VAR="original"
}
export MY_VAR="original"
the_func
子 shell 和只读变量还不够好,因为在子 shell 之外也需要这些变量。命令的参数或名称可以位于可能与子进程分类的变量中。
答案1
- 姆克什
- 猛击与
declare +x MY_VAR=value
. (local +x
也typeset +x
可以工作)。
然而,在 Bash 中,它会在以下情况下失败:
my_func () {
local +x MY_VAR="..."
bash my.sh # ERROR in Bash: this gets "original" instead of "2nd def"
# Works in mksh: "2nd def" is passed.
}
export MY_VAR="original"
MY_VAR="2nd def" my_func
它直观地表现在姆克什。