特定字符串挂[,[[

特定字符串挂[,[[

尽管模糊测试我发现这是可能的,通过定义

var=$'\365\\'

,执行以下两个命令(用于删除最后一个换行符之前的所有内容)无限期挂起,占用 100% CPU在 Bash 4.2.25(1)-release (x86_64-pc-linux-gnu) 中:

[ -n "${var##*$'\n'}" ]
[[ -n "${var##*$'\n'}" ]]

失控bash进程不能用SIGINT( Ctrl-Ckill -SIGINT $pid) 或来中断SIGTERM,但必须用 来终止SIGKILL

我尝试使用检查值

uniname -bcp <<<"$var"

但这也悬而未决。uniname但是,可以用 杀死SIGINT

我还检查了其他一些基本命令,但它们都工作正常:

echo "$var"
printf '%q\n' "$var"
touch -- "$var"
rm -- "$var"

这里发生了什么?这可以被其他人复制吗?这是定义的行为吗?

答案1

这是 UTF-8 语言环境中补丁 29 中的一个错误,bash-4.2与包含无效 UTF-8 字符的字符串的通配相关(这\365\\是)。

您还可以使用以下命令重现它:

: *$'\365x'

这是固定在补丁30,请参阅补丁说明和邮件列表讨论了解详情。

相关内容