特定字符串挂起 [, [[

l0b*_*0b0 3 bash test

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

var=$'\365\\'
Run Code Online (Sandbox Code Playgroud)

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

[ -n "${var##*$'\n'}" ]
[[ -n "${var##*$'\n'}" ]]
Run Code Online (Sandbox Code Playgroud)

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

我尝试使用

uniname -bcp <<<"$var"
Run Code Online (Sandbox Code Playgroud)

但这也挂了。uniname,但是,可以用 杀死SIGINT

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

echo "$var"
printf '%q\n' "$var"
touch -- "$var"
rm -- "$var"
Run Code Online (Sandbox Code Playgroud)

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

Sté*_*las 7

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

您还可以使用以下方法重现它:

: *$'\365x'
Run Code Online (Sandbox Code Playgroud)

这已在补丁 30中修复,有关详细信息,请参阅补丁说明和邮件列表讨论