为什么 \033 转义对 PS1 这样的变量有效,而 \x1b 则无效?

为什么 \033 转义对 PS1 这样的变量有效,而 \x1b 则无效?

根据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运行。

相关内容