根据echo
内置文档,(以及printf
),\033
和\x1b
应该都转换为相同的 ASCII 控制代码(Esc,十进制 27)。
虽然\x1b
和\033
对于简单命令的作用相同echo -e
,但它们不能在提示变量中互换使用,例如PS1
.为什么?
答案1
因为 Bash 中没有解释它们的规定。如图所示提示在手册页的部分中bash(1)
,任意字符仅允许八进制转义。
至于为什么这个遗漏是存在的,我只能猜测它是为了与 POSIX sh 兼容,但你需要问 Chet Ramey 本人,因为甚至 Bash FAQ 的 4.12 版本还没有涵盖这个主题。
答案2
灰烬外壳:
我可以确认\x1b
使用 Busybox v1.33.1 编译的 ASH Shell 可以正确解释这一点。
为了补充 Ignacio Vazquez-Abrams 的答案,BASH 仍然会使用典型的“打印”实用程序打印十六进制转义模式的原因是因为它们被编码来处理这些事情。请参阅每个可执行文件的以下手册页摘录:
echo -e '\x61'
-e enable interpretation of backslash escapes
\xHH byte with hexadecimal value HH (1 to 2 digits)
printf '\x61\n'
\xHH byte with hexadecimal value HH (1 to 2 digits)
bash
刚刚有
\e
An escape character.
\nnn
The character whose ASCII code is the octal value nnn.
附注:
- 我只是碰巧在我的 iPad 上尝试了一下iSH应用程序
/bin/ash -> /bin/busybox
,它恰好作为其默认 shell运行。