^[ 在 shell 提示符下转义

^[ escape in shell prompt

问题

我正在用 Rust 编写一个 application(为了好玩),它允许我使用 DSL 将 git 存储库统计信息漂亮地打印到我的 bash shell 提示符中.

但是,我有一个 issue with the library 用于在终端中格式化文本。它在输出中使用了我以前从未见过的转义符 ^[。它似乎影响了换行,使得文本在终端结束之前换行到同一行。

您可以在这里看到 gnome shell and in hyper 中的演示。

复制

创建一个包含以下内容的文件shell.txt

^[[1;32m\u^[[0m^[[32m@\h^[[0m:^[[1;34m\w^[[0m

将您的提示命令设置为以下内容:

__set_prompt() {
    PS1="$(cat shell.txt)"
}
PROMPT_COMMAND=__set_prompt

问题

什么是^[转义?

是否有简单的修复方法让我的 shell 正确识别线宽?

bash --version 4.4.12(1)-release

它是文字转义字符 (ASCII 0x1b) 的表示。 shell.txt 更简单的写法是

\e[1;32m\u\e[0m\e[32m@\h\e[0m:\e[1;34m\w\e[0m

为了确保 shell 能够准确计算提示的大小,您需要将非打印字符包裹在 \[...\] 中。

\[\e[1;32m\]\u\[\e[0m\e[32m\]@\h\[\e[0m\]:\[\e[1;34m\]\w\[\e[0m\]