这是一个运行 GNU bash 4.0 版本的 FreeBSD 7.x 系统。
在 Bash 中,该set -u
选项可以强制 shell 在遇到未设置的变量时打印错误,如下所示:
$ set -u
$ echo $THISISUNSET
-su: THISISUNSET: unbound variable
$ echo $?
1
但是,我也遇到了 $* 的相同错误:
$ echo $*
-su: $*: unbound variable
$ echo $?
1
$ echo $@
-su: $@: unbound variable
Bash 手册4.3.1 内置集合特别指出set -u
忽略 $* 和 $@:
-u 执行参数扩展时,将除特殊参数“@”或“*”之外的未设置变量和参数视为错误。错误消息将写入标准错误,并且非交互式 shell 将退出。
我怎样才能解决这个问题?
答案1
这是旧版本 bash 中的一个错误,特别是 4.0β2 补丁级别 d 到 4.0 补丁级别 m。来自变更日志从 4.0 到 4.1α:
名词修复了 的行为
set -u
以符合最新的 Posix 解释:除 $@ 和 $* 之外的未设置变量的每次扩展都会导致 shell 退出。
此行为是在 4.0β2 中引入的,因为之前的(现在又是当前的)行为被认为是有问题的:
d.修复了在启用 -u 选项并且没有位置参数的情况下导致 $@ 和 $* 扩展无法退出 shell 的错误。