不会破坏长命令的 Bash 提示

dot*_*hen 6 bash prompt

我正在尝试设置一个 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)

如何使用颜色保留此提示的结构,但对其进行修复以便正确显示长命令?

Gil*_*not 9

我有一个带有颜色的花哨提示,现在 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_expr
  • PROMPT_COMMAND: 如果设置,该值在发出每个主要提示之前作为命令执行。看man bash | less +/PROMPT_COMMAND
  • tput比硬编码 ANSI 转义码要好。请参阅http://wiki.bash-hackers.org/scripting/terminalcodes
  • PIPESTATUS:一个数组变量,包含最近执行的前台管道中进程的退出状态值列表(可能只包含一个命令)。看man bash | less +/PIPESTATUS
  • cat<<-'EOF'这是一个特殊的文档-字符意味着我可以缩进代码,单引号'EOF'意味着不插入变量