我已经将 bash 输出格式更改为如下所示:
我对此非常满意。我通过将此代码添加到以下内容来实现这一点.bashrc
:
set_PS1()
{
local RESET=$(tput sgr0 )
local BOLD=$(tput bold )
local RED=$(tput setaf 1 )
local GREEN=$(tput setaf 2 )
local YELLOW=$(tput setaf 3 )
local BLUE=$(tput setaf 4 )
local CYAN=$(tput setaf 6 )
local WHOAMI='\u'
local WHERE='\w'
local HOSTNAME='\h'
local TIME='\D{%H:%M:%S}'
exit_code_prompt() {
local EXIT_CODE=$?
local RED=$(tput setaf 1 )
local GREEN=$(tput setaf 2 )
if [ $EXIT_CODE -ne 0 ]; then
echo -e "$RED$BOLD\xE2\x9C\x98 $EXIT_CODE \xE2\x86\x92" # Red cross mark symbol
else
echo -e "$GREEN$BOLD\xE2\x9C\x93 \xE2\x86\x92" # Green checkmark symbol
fi
}
local LINE_1="$BOLD$YELLOW$TIME $CYAN$WHOAMI$BLUE@$CYAN$HOSTNAME$RESET$BOLD":" $BLUE$WHERE$RESET"
local LINE_2="$BOLD\$(exit_code_prompt) "$RESET$BOLD' \$: '$RESET
PS1="$LINE_1\n$LINE_2"
unset -f set_PS1
}
set_PS1
我的问题是,如果我有一个比一行长的命令,它不会进行换行,而是覆盖同一行的内容(仅在 c 的视觉表示中):
现在,当我删除完整的命令时,它也会删除 bash 提示符的一部分:
\[
这可以通过添加和来解决\]
:
local LINE_1="\[$BOLD$YELLOW$TIME $CYAN$WHOAMI$BLUE@$CYAN$HOSTNAME$RESET$BOLD":" $BLUE$WHERE$RESET\]"
local LINE_2="\[$BOLD\$(exit_code_prompt) "$RESET$BOLD' \$: \]'$RESET
但另一个问题仍然存在。当我循环浏览最后使用的命令时,它会删除提示符$
:
我该如何解决这个问题?
我已经考虑过使用zsh
,但我不想失去bash
我已经习惯的键盘快捷键等功能......
更新:下面是我更新的代码,但仍然不起作用:
set_PS1()
{
local Reset="\\[$(tput sgr0 )\\]"
local Bold="\\[$(tput bold )\\]"
local Red="\\[$(tput setaf 1 )\\]"
local Green="\\[$(tput setaf 2 )\\]"
local Yellow="\\[$(tput setaf 3 )\\]"
local Blue="\\[$(tput setaf 4 )\\]"
local MagentaBG="\\[$(tput setab 5 )\\]"
local Cyan="\\[$(tput setaf 6 )\\]"
local Whoami='\u'
local Where='\w'
local Hostname='\h'
local Time='\D{%H:%M:%S}'
local Exit_Code="$?"
exit_code_prompt() {
local Exit_Code="$?"
local Red="$(tput setaf 1 )"
local Green="$(tput setaf 2 )"
if [ $Exit_Code -ne 0 ]; then
printf "$Red\xE2\x9C\x98 $Exit_Code \xE2\x86\x92 " # Red cross mark symbol
else
printf "$Green\xE2\x9C\x93 \xE2\x86\x92 " # Green checkmark symbol
fi
}
local Line_1="$Bold$Yellow$Time $Cyan$Whoami$Blue@$Cyan$Hostname$Reset$Bold":" $Blue$Where$Reset"
local Line_2="$Bold\$(exit_code_prompt)$Reset$Bold \$: $Reset"
PS1="$Line_1\n$Line_2"
unset -f set_PS1
}
set_PS1
我也会遇到和以前一样的问题。超过一行的文本将出现在同一行的开头并被覆盖。循环执行命令会导致提示的一部分被删除,或者导致显示先前命令的一部分无法访问的视觉错误。
更新2:问题肯定出在exit_code_prompt
函数上。当我从$Line_2
一切中删除它时,一切都会按预期进行。
按照@Daniel的建议,使用
与所有其他颜色代码类似。
从手册中的6.9 控制提示开始:
循环回到你的问题:
这是因为如果没有
\[
和\]
来包装控制序列,bash 就无法正确计算提示符的长度。