我基本上知道问题是什么,因为我需要使用\[...\]
它来转义(非空格?)字符,并允许 bash 正确计算提示符的宽度。
然而,我无法解决所有问题,并且一直在尝试和错误,因为我不太明白我到底需要在哪里\[...\]
放置所有位置。
STARTCOLOR='\[\e[0;31m\]'
ENDCOLOR='\[\e[0m\]'
BACKGROUND='\[\e[47m\]'
export PS1="$STARTCOLOR$BACKGROUND\u@\h \[\t\]$ENDCOLOR\w>\$?\$\]"
是我正在使用的。现在唯一的问题似乎是,如果我使用箭头键滚动先前的命令太长时间,\w>\$?\$\
PS1 的部分就会消失。如果我在使用之前的命令前进后用箭头键向后退,也会发生这种情况。
答案1
问题是您正在使用非打印标记来打印输出的内容(\t
- 时间戳)
STARTCOLOR='\[\e[0;31m\]'
ENDCOLOR='\[\e[0m\]'
BACKGROUND='\[\e[47m\]'
export PS1="$STARTCOLOR$BACKGROUND\u@\h \t$ENDCOLOR\w>\$?\$ "
仅适用\[ ... \]
于周围的非打印字符序列,例如颜色代码。
答案2
所以问题是你“过度使用”\[
和\]
。根据以下规定,这些只能用于不可打印的字符序列bash手册:
\[
Begin a sequence of non-printing characters.
This could be used to embed a terminal control sequence into the prompt.
\]
此外,您需要使用一种特殊的语法,以便 Bash 正确呈现选项卡:$'\t'
。
所以最后,提示代码的或多或少固定版本将如下所示:
#!/usr/bin/env bash
readonly PROMPT_STARTCOLOR='\[\e[0;31m\]'
readonly PROMPT_ENDCOLOR='\[\e[0m\]'
readonly PROMPT_BACKGROUND='\[\e[47m\]'
export PS1="$PROMPT_STARTCOLOR$PROMPT_BACKGROUND\u@\h"$'\t'"$PROMPT_ENDCOLOR\w>$?$"
请注意,我已重命名您的变量,以防止与您的环境发生可能的冲突。
要使用该脚本:
source <path_to_file>
我不久前问过的相关问题:if子句的提示定制问题