bash PS1设置


9

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

绿色=“ \ [\ e [32; 1m \]”
红色=“ \ 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))是什么意思?

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

添加

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

Red =“ \\ e [1; 31m”-不起作用
Red =“ \ [\ e [1; 31m \]”-工作

Answers:


12

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

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表示重置所有文本属性,表示“为我提供默认控制台颜色”


+1非常好!别介意将其复制到我的bashrc中:)
Eldelshell

@Ubersoldat。一点也不。
Alexander Pogrebnyak'9

1
用于\$在根和非根指示之间自动切换。
暂停,直到另行通知。

9

从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 Set Graphics Mode命令:

\e[<value>m

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

查看Alexander Pogrebnyak答案中列出的值,分号前的0或1选择是否使用粗体:

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

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

By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.