Bash 提示符不会破坏长命令

Bash 提示符不会破坏长命令

我正在尝试设置一个 bash 提示符,- hostname(screen#):directory$如果最后一个命令成功完成,则该提示符为绿色,如果没有成功,则为红色。这是我到目前为止所拥有的,它实际上完成了工作,但如果命令换行似乎会导致显示问题:

 PS1="\[\`if [[ \$? = "0" ]]; then echo '\e[32m'; else echo '\e[31m' ; fi\` - \h(${WINDOW}):\W$\e[00m "

谷歌搜索我发现的问题这篇很有帮助的帖子有一条评论提到将非打印字符包装起来\\[\\]避免此问题。因此我尝试了以下方法,但它没有解决问题,而且还破坏了颜色变化:

PS1="\[\`if [[ \$? = "0" ]]; then echo '\e[32m'; else echo '\e[31m' ; fi\`\] - \h(${WINDOW}):\W$\[\e[00m\] "

如何保留此提示的结构(带有颜色),但修复它以便正确显示长命令?

答案1

我有一个带有颜色的奇特提示,现在 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
)

这样就可以了 =)

PROMPT_COMMANDBash 将为每个命令运行里面的代码。

如果您有复制/粘贴问题,你可以下载脚本

输出

说明

  • (( ))是算术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'意味着不插入变量

答案2

我有一个 2 行提示符,因此可能很长的内容不会影响命令行:

glennj@homebase ~/tmp
2219 $ set | grep PS1=
PS1='\n\u@\h \w\n\! \$ '

答案3

\\[只是\[\[一开始你还有一个额外的。

答案4

这不是对原始问题的直接答案,它只是一个用法示例。

基于并感谢@stArdustͲ的回答,我找到了自定义命令提示符的正确解决方案,以在终端的右上角显示电池的状态* 。颜色在来自内部的独立文件中定义.bashrc

PROMPT_COMMAND=$(
    cat<<-'EOF'
    function battery_percentage {
        PERCENTAGE=$(upower -i $(echo $(upower -e |grep 'battery')) |grep 'percentage' |sed -e 's/^[ \t]*//;s/[[:space:]]\+/ /g;s/[ \t]*$//' |cut -d' ' -f2 |cut -d"%" -f1)
        BColor='IGray'
        if [ "${PERCENTAGE}" -lt 15 ]
            then PColor='BlinkIRed'
                 PBackground='On_White'
            else PColor='Gray'
        fi
        echo "\001${!BColor}\002Battery\001${!PColor}\002 ${PERCENTAGE}% \001${Reset}\002"
    }

    function battery_time {
        TIME=$(upower -i $(echo $(upower -e |grep 'battery')) |grep 'time' |sed -e 's/^[ \t]*//;s/[[:space:]]\+/ /g;s/[ \t]*$//' |cut -d' ' -f4,5)
        echo "\001${IGray}\002${TIME}\001${Reset}\002"
    }

    export PS1="\[\e[s\]\[\e[1;\$((COLUMNS-26))f\]$(battery_percentage) $(battery_time)\[\e[u\]${PS1}"
EOF
)

最后,PS1看起来像:

\[\e[s\]\[\e[1;$((COLUMNS-26))f\]\001\e[0;38;5;8m\002Battery\001\e[0;38;5;7m\002 82% \001\e[0m\002 \001\e[0;38;5;8m\0023.6 hours\001\e[0m\002\[\e[u\]\[\e[0;38;5;232m\]\[\e[48;5;5m\] \u \[\e[0;38;5;5m\]\[\e[48;5;11m\] \[\e[0;38;5;232m\]\[\e[48;5;11m\]@\H \[\e[0;38;5;11m\]\[\e[48;5;0m\]\[\e[0m\] \[\e[0;38;5;6m\]\w\a \[\e[1;38;5;5m\]→\e[0m

笔记,不过,当我上下滚动命令历史记录时,我确实遇到了一些光标定位问题。


* ThinkPad 笔记本电脑

相关内容