在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
的变量名称?
答案 0 :(得分:0)
在这篇文章Use of read-only variables in shell scripts中,看起来子进程不会继承readonly状态。
所以你可以启动一个子进程,而不是像这样的子shell:
readonly a=12
bash -c ' a=13; echo $a '