我正在尝试设置一个 bash 提示,- hostname(screen#):directory$如果最后一个命令成功完成则为绿色,否则为红色。到目前为止,这是我所拥有的,它实际上完成了这项工作,但如果命令换行,似乎会导致显示问题:
PS1="\[\`if [[ \$? = "0" ]]; then echo '\e[32m'; else echo '\e[31m' ; fi\` - \h(${WINDOW}):\W$\e[00m "
Run Code Online (Sandbox Code Playgroud)
谷歌搜索这个问题,我发现这个有用的 SO 帖子有一条评论,其中提到了将非打印字符包裹起来\\[并\\]避免这个问题。因此,我尝试了以下方法,但并没有解决问题,而且还破坏了颜色变化:
PS1="\[\`if [[ \$? = "0" ]]; then echo '\e[32m'; else echo '\e[31m' ; fi\`\] - \h(${WINDOW}):\W$\[\e[00m\] "
Run Code Online (Sandbox Code Playgroud)
如何使用颜色保留此提示的结构,但对其进行修复以便正确显示长命令?
我有一个带有颜色的花哨提示,现在 bash 似乎不知道我的终端有多宽。线条错误地环绕。
我有另一种正确的方法来做到这一点,将此代码放入您的~/.bashrc或创建一个新文件中,然后source file:
PROMPT_COMMAND=$(
cat<<-'EOF'
retval=$?
RED=$(tput setaf 1)
GREEN=$(tput setaf 2)
STOP=$(tput sgr0)
# arithmetic using bash parameter expansion on a array
if (($retval + ${PIPESTATUS[@]/%/+} + 0)); then
PS1="\[$RED\]\u@\h:\w$ \[$STOP\]"
else
PS1="\[$GREEN\]\u@\h:\w$ \[$STOP\]"
fi
EOF
)
Run Code Online (Sandbox Code Playgroud)
这样就可以了 =)
Bash 将为PROMPT_COMMAND每个命令运行里面的代码。
如果您有复制/粘贴问题,您可以下载脚本

说明
(( ))是算术bash,见http://wiki.bash-hackers.org/syntax/arith_exprPROMPT_COMMAND: 如果设置,该值在发出每个主要提示之前作为命令执行。看man bash | less +/PROMPT_COMMANDtput比硬编码 ANSI 转义码要好。请参阅http://wiki.bash-hackers.org/scripting/terminalcodesPIPESTATUS:一个数组变量,包含最近执行的前台管道中进程的退出状态值列表(可能只包含一个命令)。看man bash | less +/PIPESTATUScat<<-'EOF'这是一个特殊的文档:-字符意味着我可以缩进代码,单引号'EOF'意味着不插入变量