是否可以在bash子shell中重用只读变量?

时间:2016-03-18 10:19:38

标签: bash shell readonly shadowing subshell

在Bash中,在子shell中声明的变量与在父shell中声明的具有相同名称的变量不同,除非后者明确地export编辑:

a=12
(a=13; echo $a)
echo $a

# Output:
# 13
# 12 Outer variable wasn't changed

但是,如果外部变量声明为readonly,则子shell无法重新定义它,防止重复使用相同的名称,即使它不会造成任何伤害:

readonly a=12
(a=13; echo $a)
echo $a

# Output:
# test.sh: line 2: a: readonly variable
# 12 Only the outer echo is executed

如果我将readonly声明为子shell中的变量,我仍然会得到相同的错误,但这次也执行了子shell中的echo

readonly a=12
(readonly a=13; echo $a)
echo $a

# Output:
# test.sh: line 2: a: readonly variable
# 12 global value is used in sub-shell
# 12

现在,就我的目标而言,避免在子函数中定义的变量(由其他函数调用的函数)与在具有相同名称的父函数中定义的变量冲突时,我可能满足于使用非{父shell中的变量{1}}。但是,如果将变量声明为readonly,如果它们不打算更改,那么它非常有用,因为它有助于防止出现多种错误,所以我想避免放弃在他们身上。

那么,您是否知道在子shell中是否可以重用在父shell中声明为readonly的变量名称?

1 个答案:

答案 0 :(得分:0)

在这篇文章Use of read-only variables in shell scripts中,看起来子进程不会继承readonly状态。

所以你可以启动一个子进程,而不是像这样的子shell:

readonly a=12
bash -c ' a=13; echo $a '