bash 4.3 中“本地”内置行为的未记录更改?

bash 4.3 中“本地”内置行为的未记录更改?

在 bash 4.2 中,一个变量被声明为函数的局部变量,但是没有尽管如此,默认值仍会进入变量列表 - 至少就“declare -p”而言:

vermicelli$ bash --version | grep release
GNU bash, version 4.2.37(1)-release (x86_64-pc-linux-gnu)
vermicelli$ bash -c 'f1() { local Y; declare -p Y; }; f1'
declare -- Y
vermicelli$ 

然而,在 bash 4.3 中,情况不再是这样:

lasagne$ bash --version | grep release
GNU bash, version 4.3.46(1)-release (x86_64-pc-linux-gnu)
lasagne$ bash -c 'f1() { local Y; declare -p Y; }; f1'
bash: line 0: declare: Y: not found
lasagne$ 

这种行为改变是否记录在任何地方?

如果有默认值提供(例如将“local Y”更改为“local Y=42”),则两个 bash 版本的行为相同。

(我检查了 bash 4.3 的手册页,特别是处理声明和本地内置函数、shopt 选项 compat42 的段落,以及常见问题解答,特别是处理 4.3 中新增内容的段落,但我没有找到任何提及这种行为变化的行为。)

答案1

bash 变更日志摘录:

本文档详细介绍了此版本 bash-4.4-alpha 与之前版本 bash-4.3-release 之间的更改。

3. Bash 的新特性

F。声明选项和类似的内置函数-p将显示命名变量的属性,即使这些变量尚未分配值(技术上未设置)。


本文档详细介绍了此版本 bash-4.3-alpha 与之前版本 bash-4.2-release 之间的更改。

1.Bash 的更改

呵呵。修复了导致declaretest查找已给定属性但未分配值的变量的错误。未设置此类变量。

请注意,这local只是 的别名declare,除非local在函数内部调用它时会出错。

看起来typeset -p列出未设置的变量被认为是一个错误,但随后该行为被恢复,因为列出declare -p此类变量是“一个足够常见的请求”

相关内容