bash PS1 变量设置

bash PS1 变量设置

我正在尝试进行PS1如下配置:

Green="\[\e[32;1m\]"
Red="\e[0;31m"
Purple="\e[0;35m"
STARTCOLOR="\[\e[40m\]"
ENDCOLOR="\[\e[0m\]"
export 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)

附录

经过一些测试,我得到以下更改可以解决问题。也就是说,\e格式应该被\\[\e格式替换。

Red="\\e[1;31m"    #-- not working
Red="\[\e[1;31m\]" #-- working

答案1

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

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}"
}

然后你可以这样做:

PS1=$( set_prompt )

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

unset -f set_prompt

以下是解释 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表示重置所有文本属性,意思是“给我默认的控制台颜色”

答案2

来自 bash 手册:

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

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

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

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

答案3

大多数现代终端仿真器都能够使用 ANSI 转义码来控制显示的各个方面。

大多数 ANSI 代码以 2 字符代码 ESC-[ 开头,即转义字符(ASCII 十进制 27),后跟左方括号字符。该序列也称为 CSI 或控制序列启动器。

因为转义字符不是您可以直接键入的字符(Esc 键有其他通常是特定于应用程序的用途),所以 bash 使用 '\e' 来引用它。

使用 ANSI 设置图形模式命令更改文本颜色:

\e[<value>m

其中<value>可以是由分号 ( ;) 分隔的值列表。尽管粗体属性与颜色属性结合使用非常有用,但通常只使用一个值。

查看 Alexander Pogrebnyak 的答案中列出的值,分号之前的 0 或 1 选择粗体或不粗体:

\e[1m  # bold
\e[5m  # blink
\e[0m  # all attributes off

这里有一个有用的代码列表http://ascii-table.com/ansi-escape-sequences.php

相关内容