在 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 的更改
呵呵。修复了导致
declare
并test
查找已给定属性但未分配值的变量的错误。未设置此类变量。
请注意,这local
只是 的别名declare
,除非local
在函数内部调用它时会出错。
看起来typeset -p
列出未设置的变量被认为是一个错误,但随后该行为被恢复,因为列出declare -p
此类变量是“一个足够常见的请求”。