我正在尝试进行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