【发布时间】:2020-03-19 22:58:01
【问题描述】:
在 bash 函数中声明一个局部变量会使该变量仅在函数本身及其子函数内部可见,所以如果我运行:
#!/bin/bash
set -e
func_one() {
echo "${var}"
}
func_two() {
local -r var="var from func_two"
func_one
}
func_two
输出是:
var from func_two
即使 var 变量在 func_two 内被声明为本地和只读变量,也可以从函数 func_one 访问。在后者中,可以声明一个同名的变量,同时也是本地和只读的:
#!/bin/bash
set -e
func_one() {
local -r var="var from func_one"
echo "${var}"
}
func_two() {
local -r var="var from func_two"
func_one
}
func_two
输出是:
var from func_one
如果从 EXIT 陷阱调用 func_one,也会发生同样的情况:
#!/bin/bash
set -e
func_one() {
local -r var="var from func_one"
echo "${var}"
}
func_two() {
local -r var="var from func_two"
trap 'func_one' EXIT
echo "${var}"
}
func_two
运行我收到的代码:
var from func_two
var from func_one
但是,如果在错误后执行 EXIT 陷阱(如果命令以非零状态退出,则设置 -e 选项使脚本立即退出)。看起来无法重新分配 func_one 中的 var 变量:
#!/bin/bash
set -e
func_one() {
local -r var="var from func_one"
echo "${var}"
}
func_two() {
local -r var="var from func_two"
trap 'func_one' EXIT
echo "${var}"
false
}
func_two
运行我收到的代码:
var from func_two
local: var: readonly variable
谁能向我解释为什么会发生这种情况?提前谢谢你。
【问题讨论】:
-
我想说这是不使用
set -e的另一个原因,但由于set -e是由POSIX 定义的,而local是bash扩展名,这可能是local的实现中的一个错误。我会注意到,如果您放弃-r选项并在调用local之后调用readonly var,那么dash中的相同代码将按预期工作(它有自己的local的非标准实现) 但在bash中产生相同的错误。
标签: bash local readonly bash-trap