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

标签 bash shell readonly shadowing subshell

在 Bash 中,在子 shell 中声明的变量与在父 shell 中声明的同名变量不同,除非后者被显式exported:

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

如果我将子 shell 中的变量也声明为 readonly,我仍然会得到同样的错误,但是这次执行了子 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

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

那么,您知道是否有一种方法可以从子 shell 中重用在父 shell 中声明为 readonly 的变量名?

最佳答案

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

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

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

输出:

13
12

关于bash - 是否可以在 bash 子 shell 中重用只读变量?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/36081799/

相关文章:

java - 许多类都使用一个对象,但对它有不同的看法

eclipse - 如何在Eclipse中使只读编辑器(Eclipse插件开发)

linux - bash - 添加额外的 IF 语句

bash - 将管道数据获取到函数

linux - 语法错误 : "(" unexpected (expecting "fi")

linux - sed 在替换某些正则表达式时行为不端

java - 如何在 UNIX 目录中的每个文件上运行 Java 程序?

jquery - 只读属性切换

linux - 从命令行参数使用 bash 脚本复制多个文件?

Python psutil 不显示所有子进程