使用 bash 4.4.20(1) 运行以下脚本时失败
#!/bin/bash
bar() {
local args=("y")
}
foo() {
local -r args=("x")
bar
}
foo
有错误line 3: args: readonly variable
,但使用 bash 4.2.46(2) 运行时成功,阅读后有意义24.2.局部变量。
以下带有非数组变量的脚本运行时没有任何问题:
#!/bin/bash
bar() {
local args="y"
}
foo() {
local -r args="x"
bar
}
foo
我找不到任何变化这解释了 bash 4.2.46(2) 和 bash 4.4.20(1) 之间的区别。
问:这是 bash 4.4.20(1) 中的错误吗?如果这是预期的行为那么为什么第二个脚本不会失败?
答案1
您的脚本可以在 5.1 版本的bash
shell 中正确运行,但不能在 4.3 之后的中间版本中运行。
这些错误可能是在版本 4.3 或 4.4 左右引入的。在这两个版本的开发过程中,多项更改涉及只读声明和变量的工作方式。
更改日志中至少有两个条目可能与修复所涉及的错误有关:
- 对于
bash-5.0-alpha
,更改日志有话要说(我假设引用readonly
内置函数也意味着local -r
受到影响):
修复了一个错误,该错误可能导致内置函数
readonly
在应用于函数内的数组和标量变量时表现不同。
- 对于
bash-5.1-alpha
,可能与此相关的另一个错误还提到了:
修复了导致与函数临时环境中出现的变量同名的局部变量不被标记为局部的错误。
平分使用shell 的 Git 存储库和你的脚本,我们发现了引入的错误bash-4.4-rc1
,然后固定在bash-5.1-alpha
。由于两者都是大型提交,因此很难指出代码中的任何特定更改。