我正在使用一个外部命令来填充我的bash提示符,它每次评估PS1时都会运行。然而,当这个命令输出非可打印字符(比如颜色转义代码)时,我遇到了问题。
以下是一个例子:
$ cat green_cheese.sh
#!/bin/bash
echo -e "\033[32mcheese\033[0m"
$ export PS1="\$(./green_cheese.sh) \$"
cheese $ # <- cheese is green!
cheese $ <now type really long command>
在处理PS1提示符中的非打印字符时,标准方法是将它们包含在\[
和\]
转义序列中。问题在于,如果您从外部命令执行此操作,则这些转义序列不会被PS1解释器解析:
$ cat green_cheese.sh
#!/bin/bash
echo -e "\[\033[32m\]cheese\[\033[0m\]"
$ export PS1="\$(./green_cheese.sh) \$"
\[\]cheese\[\] $ # <- FAIL!
有没有特定的转义序列可以从外部命令中使用以实现所需的结果?或者,我是否可以手动告诉提示符要设置多少个字符作为提示宽度?
假设我可以从外部命令中打印任何我想要的内容,并且该命令可以相当智能(例如,计算输出中的字符数)。我还可以使export PS1=...
命令变得非常复杂。 但是,颜色的转义代码必须来自外部命令。
提前致谢!
\001
和\002
,又称为RL_PROMPT_START_IGNORE和RL_PROMPT_END_IGNORE,是一个文档不足的readline特性。Bash将\[..\]
转换为Readline中的\001..\002
,但忽略了已经存在的转义字符,因此这个实现细节泄漏出来了(而且它非常有用,你几乎不能把它称为一个bug)。 - that other guyPROMPT_COMMAND
时,我想起了这个问题并回来看了一下,但似乎这个想法已经被提出了。我还有一个想法,即bash实际上可能会从\[
和\]
中产生字符,并尝试进行检查,但是ttyrec
的输出令人困惑,所以我放弃了。顺便加一分。 - konsolebox