我正在OsX上自定义我的bash提示符,以包括git分支和一些分支状态标记。这会破坏换行。
我知道我必须添加 \[ 和 \] 来防止这个问题,但在函数中这样做会显示文字 \[ 和 \]。
我该怎么在这些函数中转义这样的序列?
免责声明:这是我在bash脚本编写方面的首次尝试。
我知道我必须添加 \[ 和 \] 来防止这个问题,但在函数中这样做会显示文字 \[ 和 \]。
我该怎么在这些函数中转义这样的序列?
免责声明:这是我在bash脚本编写方面的首次尝试。
function parse_git_dirty {
# TODO make git status response a variable
# [branch+] : working dir has staged changes
if [[ $(git status 2> /dev/null | grep "to be committed") ]]
then S=$S"$(tput setaf 2)+$(tput sgr0)"
fi
# [branch+] : working dir has unstaged changes
if [[ $(git status 2> /dev/null | grep "not staged for commit") ]]
then S=$S"$(tput setaf 1)+$(tput sgr0)"
fi
# [branch+] : working dir has untracked files
if [[ $(git status 2> /dev/null | grep "tracked files") ]]
then S=$S"$(tput setaf 1)+$(tput sgr0)"
fi
# [branch<] : local branch is behind origin
if [[ $(git status 2> /dev/null | grep "Your branch is behind") ]]
then S=$S"$(tput setaf 5)<$(tput sgr0)"
fi
# [branch>] : local branch is ahead origin
if [[ $(git status 2> /dev/null | grep "branch is ahead of") ]]
then S=$S"$(tput setaf 5)>$(tput sgr0)"
fi
# [branch<>] : branches have diverged
if [[ $(git status 2> /dev/null | grep "have diverged") ]]
then S=$S"$(tput setaf 5)<>$(tput sgr0)"
fi
echo $S
}
function parse_git_branch {
git branch --no-color 2> /dev/null | sed -e '/^[^*]/d' -e 's/* \(.*\)/\1/'
}
function show_git_branch {
if [[ $(parse_git_branch) ]]
then echo "$(tput setaf 2)($(tput sgr0)$(parse_git_branch)$(parse_git_dirty)$(tput setaf 2))$(tput sgr0)"
fi
}
export PS1="\u\[$(tput setaf 2)\]@\[$(tput sgr0)\]\h\[$(tput setaf 2)\]:\[$(tput sgr0)\]\W\[\$(show_git_branch)\] "
git status
需要大约40秒才能完成,而您的代码将为每个bash提示符运行6次git status
!我在下面添加了一个答案,提到了__git_ps1
,它可能做你想要的事情,并且可以配置输出的不同详细级别。 - Mark Longair