虽然模糊测试我发现这是可能的,通过定义
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-C或kill -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)
这里发生了什么?这是其他人可以复制的吗?这是定义的行为吗?
这是bash-4.2
UTF-8 语言环境中最多补丁 29 中的一个错误,与包含无效 UTF-8 字符(即\365\\
)的字符串相关联。
您还可以使用以下方法重现它:
: *$'\365x'
Run Code Online (Sandbox Code Playgroud)
这已在补丁 30中修复,有关详细信息,请参阅补丁说明和邮件列表讨论。
归档时间: |
|
查看次数: |
116 次 |
最近记录: |