Bash printf 给出奇怪的随机输出?

问题描述 投票:0回答:1

我有这个 Bash 脚本:

#!/bin/bash
foo=$'\376'
printf '%x' "'$foo"

如果我像这样运行脚本几次:

chmod +x script.sh
./script.sh
./script.sh
./script.sh
./script.sh
...

输出是:

55ad
562b
5576
55f0
557d
5642
55c6
5568
55ef

为什么我会得到这个随机输出?如果应该只打印

fe

我正在使用

Bash GNU bash, version 4.4.20(1)-release (x86_64-redhat-linux-gnu)

bash
1个回答
0
投票

这似乎是 Bash 中的一个错误。虽然我没有设置

LC_ALL
,但如果我运行
locale
它会打印:

❯ locale
LANG=en_GB.UTF-8
LC_CTYPE="en_GB.UTF-8"
LC_NUMERIC="en_GB.UTF-8"
LC_TIME="en_GB.UTF-8"
LC_COLLATE="en_GB.UTF-8"
LC_MONETARY="en_GB.UTF-8"
LC_MESSAGES="en_GB.UTF-8"
LC_PAPER="en_GB.UTF-8"
LC_NAME="en_GB.UTF-8"
LC_ADDRESS="en_GB.UTF-8"
LC_TELEPHONE="en_GB.UTF-8"
LC_MEASUREMENT="en_GB.UTF-8"
LC_IDENTIFICATION="en_GB.UTF-8"
LC_ALL=

如果将值更改为:

foo=$'\376\123'

然后它确定性地打印

563e
。我怀疑它试图将值解释为 UTF-8 并进行越界读取,这就是它获取随机值的原因。我仍然不太确定
563e
来自哪里。

使用

LC_ALL=C
解决了这个问题。

© www.soinside.com 2019 - 2024. All rights reserved.