Macos Mac OS X的bash提示着色 目标

Macos Mac OS X的bash提示着色 目标,macos,git,bash,command-prompt,Macos,Git,Bash,Command Prompt,我正试图在MacOSX上使用git分支(如果可用)对bash提示符进行着色 我试过的 以我有限的bash知识,我从谷歌搜索和其他问题中拼凑出以下代码: function parse_git_branch() { branch=$(git rev-parse --abbrev-ref HEAD 2>/dev/null) if [[ -z "$branch" ]]; then return fi

我正试图在MacOSX上使用git分支(如果可用)对bash提示符进行着色

我试过的 以我有限的bash知识,我从谷歌搜索和其他问题中拼凑出以下代码:

function parse_git_branch() {
        branch=$(git rev-parse --abbrev-ref HEAD 2>/dev/null)

        if [[ -z "$branch" ]]; then
                return
        fi

        if [[ -z "$(git status -s 2>/dev/null)" ]]; then
                color=$'\e[1;32m'
        else
                color=$'\e[1;31m'
        fi

        echo "\[$color\] (${branch}) "
}

PS1="\h:\W \u\$(parse_git_branch)\[\e[0m\]\$ "
问题 当着色工作时,提示符包含来自
parse\u git\u分支的一些转义序列

leonidas:AYI jason\[\] (master) $
此外,命令历史记录(up)和递归搜索(ctrl+r)等功能会产生额外的字符

leonidas:AYI jason\[\] (master) $h)`re': git status
问题
  • 如何使用适当的可见和不可见字符修复转义
  • 我应该使用
    tput
    而不是这些颜色代码来获得更广泛的支持吗

  • 为什么要这么麻烦呢。只需创建一个
    .bash\u配置文件
    我的建议是:-

    export PS1="\[\033[0;30;33m\]\w\[\e[0m\]$ "
    
    您应该设置
    .bashrc
    以引用此

    [ -r ~/.bash_profile ] && source ~/.bash_profile
    

    为什么要这么麻烦呢。只需创建一个
    .bash\u配置文件
    我的建议是:-

    export PS1="\[\033[0;30;33m\]\w\[\e[0m\]$ "
    
    您应该设置
    .bashrc
    以引用此

    [ -r ~/.bash_profile ] && source ~/.bash_profile
    

    问题是扩展数据中不考虑
    \[\]

    为了避免这种情况,您可以在
    PROMPT\u命令
    中将PS1设置为其自身的扩展后版本,其内容在每次提示之前进行评估:

    PROMPT_COMMAND='PS1="\h:\W \u$(parse_git_branch)\[\e[0m\]\\\$ "'
    

    由于
    \[\]
    现在是PS1文本值的一部分,并且不是通过提示扩展创建的,因此它们被正确解释

    问题在于扩展数据中不考虑
    \[\]

    为了避免这种情况,您可以在
    PROMPT\u命令
    中将PS1设置为其自身的扩展后版本,其内容在每次提示之前进行评估:

    PROMPT_COMMAND='PS1="\h:\W \u$(parse_git_branch)\[\e[0m\]\\\$ "'
    

    由于
    \[\]
    现在是PS1文本值的一部分,并且不是通过提示扩展创建的,因此它们被正确解释

    (1)切换到,(2)获取,(3),(4)永不回头@奥利·查尔斯沃思,谢谢你的建议。但是我想解决当前的问题。@Kevin,你能提供更多信息吗?在哪里,为什么?当你设置
    PS1=“…$(parse\u git\u branch)…”
    时,它会在寻找文件来源时精确地计算一次。您需要
    PS1='…'
    每次都对其进行评估。@凯文,这不是我遇到的问题。每次都会进行评估。(1)切换到,(2)获取,(3),(4)永不回头@奥利·查尔斯沃思,谢谢你的建议。但是我想解决当前的问题。@Kevin,你能提供更多信息吗?在哪里,为什么?当你设置
    PS1=“…$(parse\u git\u branch)…”
    时,它会在寻找文件来源时精确地计算一次。您需要
    PS1='…'
    每次都对其进行评估。@凯文,这不是我遇到的问题。每次都会对它进行评估。查看我的更新,我正在尝试包括git分支(如果可用)。查看我的更新,我正在尝试包括git分支(如果可用)。是的。更简单的例子:
    ps1(){echo'\h:\W$;};PS1='$(PS1)'
    您的提示将是
    \h:\W$
    。虽然我将尝试此方法,但我觉得它有点黑客味。一定有办法解决我的问题。更简单的例子:
    ps1(){echo'\h:\W$;};PS1='$(PS1)'
    您的提示将是
    \h:\W$
    。虽然我将尝试此方法,但我觉得它有点黑客味。一定有办法解决我的问题。