bash PS1 设置

pro*_*eek 9 bash prompt

我正在尝试按如下方式配置 PS1。

绿色="\[\e[32;1m\]"
红色="\e[0;31m"
紫色="\e[0;35m"
STARTCOLOR="\[\e[40m\]"
ENDCOLOR="\[\e[0m\]"
导出 PS1="$STARTCOLOR$Green\u@$Purple\h $Red\w$Green>$ENDCOLOR"

我有一些问题。

  • "[\e[32;1m]" 和 \e[32;1m" 有什么区别?它们一样吗?
  • 运行“export PS1”命令后,它运行良好,但是当我输入大约 20 个字符时,我附加的字符会被覆盖。这有什么问题?
  • STARTCOLOR(\e[40m)/ENDCOLOR(\e[0m)] 是什么意思?

http://a.imageshack.us/img8/606/resultqm.jpg

添加

经过一些测试,我得到以下更改可以解决问题。即,“\e”格式应替换为“\[\e”格式。

Red="\\e[1;31m" -- 不工作
Red="\[\e[1;31m\]" -- 工作

Ale*_*yak 13

我有一个辅助函数来设置提示,因为我不想花更多的时间来寻找转义代码引用,我已经将所有文本颜色值编码到其中。

function set_prompt ( )
{
    # Prompt setup
    # ##################

    # Black            \e[0;30m
    # Blue             \e[0;34m
    # Green            \e[0;32m
    # Cyan             \e[0;36m
    # Red              \e[0;31m
    # Purple           \e[0;35m
    # Brown            \e[0;33m
    # Gray             \e[0;37m
    # Dark Gray        \e[1;30m
    # Light Blue       \e[1;34m
    # Light Green      \e[1;32m
    # Light Cyan       \e[1;36m
    # Light Red        \e[1;31m
    # Light Purple     \e[1;35m
    # Yellow           \e[1;33m
    # White            \e[1;37m

    local COLOR_DEFAULT='\[\e[0m\]'
    local COLOR_BLACK='\[\e[0;30m\]'
    local COLOR_BLUE='\[\e[0;34m\]'
    local COLOR_GREEN='\[\e[0;32m\]'
    local COLOR_CYAN='\[\e[0;36m\]'
    local COLOR_RED='\[\e[0;31m\]'
    local COLOR_PURPLE='\[\e[0;35m\]'
    local COLOR_BROWN='\[\e[0;33m\]'
    local COLOR_GRAY='\[\e[0;37m\]'
    local COLOR_DARK_GRAY='\[\e[1;30m\]'
    local COLOR_L_BLUE='\[\e[1;34m\]'
    local COLOR_L_GREEN='\[\e[1;32m\]'
    local COLOR_L_CYAN='\[\e[1;36m\]'
    local COLOR_L_RED='\[\e[1;31m\]'
    local COLOR_L_PURPLE='\[\e[1;35m\]'
    local COLOR_YELLOW='\[\e[1;33m\]'
    local COLOR_WHITE='\[\e[1;37m\]'

    local PS1_SET_TITLE='\[\e]0;\w\a\]'

    local PS1_SET_TIME="${COLOR_DEFAULT}\t"
    local PS1_SET_RET_CODE="${COLOR_L_RED}(\$?)"
    local PS1_SET_USER="${COLOR_L_GREEN}\u@\h"
    local PS1_SET_PWD="${COLOR_YELLOW}\w"

    local PS1_LN_1="${PS1_SET_TITLE}\n"
    local PS1_LN_2="${PS1_SET_TIME} ${PS1_SET_RET_CODE} "
    local PS1_LN_2="${PS1_LN_2}${PS1_SET_USER} ${PS1_SET_PWD} ${COLOR_DEFAULT}\n"

    echo "${PS1_LN_1}${PS1_LN_2}"
}
Run Code Online (Sandbox Code Playgroud)

然后你可以这样做:

PS1=$( set_prompt )

# Use '#' for root shell
export PS1=${PS1}'$ '

unset -f set_prompt
Run Code Online (Sandbox Code Playgroud)

这是解释 VT100 终端代码的链接:http : //www.termsys.demon.co.uk/vtansi.htm

\[- 非打印字符的开始序列 - 非打印字符的
\]结束序列

  • "[\e[32;1m]" 和 \e[32;1m" 有什么区别?它们一样吗?

不一样,它应该是\[\e[32;1m\]'. Without[]` 它会尝试在控制台中打印序列。

  • STARTCOLOR(\e[40m)/ENDCOLOR(\e[0m)] 是什么意思?

STARTCOLOR,表示设置背景为黑色,ENDCOLOR 表示重置所有文本属性,意思是“给我默认的控制台颜色”

  • 使用“\$”自动在 root 和非 root 指示之间切换。 (2认同)

Gil*_*il' 9

从 bash 手册:

\[    开始一系列非打印字符,可用于将终端控制序列嵌入到提示中
\]    end 一系列非打印字符

\[并且\]不会传递到终端。他们告诉 bash 他们之间的字符不会被打印出来。没有它们,bash 无法知道转义字符(例如[32;1m)后面的序列不占用屏幕上的任何空间,这解释了为什么当您将它们排除在外时它没有正确计算提示的长度。

请注意,您的问题不是很一致(或者可能只是 Markdown 的错误);您需要在 中有一个文字反斜杠括号序列$PS1,而不仅仅是一个括号(将按字面显示)。

以 开头的转义序列\e由终端模拟器解释。它们记录在Xterm 控制序列 (ctlseqs)文档中(其他终端仿真器通常是兼容的)。例如,\e[32;1m切换到粗体和绿色前景;\e[40m将背景颜色切换为黑色;\e[0m恢复默认属性。