Eu faço algo semelhante com o meu prompt, e aqui está como eu vou um "obter o ramo git
no meu prompt enquanto ainda mostra o código de saída do último comando" coisa:
parse_git_branch() {
exit_code=$?
local stdcolor
local branchcolor
local lines
stdcolor="^[[0;32m"
if [[ -d ./.git ]] || $( git status > /dev/null 2>&1 ); then
lines=$(git status -s | wc -l)
if [[ 0 -eq ${lines} ]]; then
# Working copy is clean
branchcolor="^[[1;32m"
elif git status -s 2> /dev/null | grep -q '^A'; then
# If we have staged commits waiting, red; else yellow
branchcolor="^[[1;31m"
else
branchcolor="^[[1;33m"
fi
git branch 2> /dev/null | sed -e '/^[^*]/d' -e "s/* \(.*\)/ $stdcolor($branchcolor$stdcolor)/"
fi
return $exit_code
}
export PS1='\[\e]0;\u@\h: \w\a\]\[\e[38;5;14m\]\u\[\e[38;5;8m\]@\[\e[38;5;6m\]\h\[\e[38;5;8m\]:\[\e[38;5;10m\]\w'"\$(parse_git_branch) \e[31m\${?##0}\n"'\[\e[$(((($?>0))*31))m\]\$\[\e[0m\] '
O prompt resultante (higienizado) e sua aparência em uma área de trabalho git
:
me@host:~/src/project (devel)
$ false
me@host:~/src/project (devel) 1
$ true
me@host:~/src/project (devel)
$
O resultado de tudo isso é que:
- Se eu estiver em um espaço de trabalho
git
, minha ramificação atual será mostrada. Verde se estiver limpa, amarela se estiver suja e vermelha se houver arquivos de teste aguardando uma confirmação
- Se o código de saída do último comando era diferente de zero, ele é mostrado (em vermelho) no prompt e ainda tenho acesso a
$?
.