Bash echo color como saída de função no PS1

0

Eu quero que meu PS1 exiba (se eu estiver em uma pasta git) a ramificação e cole o ramo com vermelho se o diretório de trabalho estiver sujo e azul se estiver limpo. Aqui está o que eu vim para

IBlack='\e[0;90m'       # Nero
IRed='\e[0;91m'         # Rosso
IGreen='\e[0;92m'       # Verde
IYellow='\e[0;93m'      # Giallo
IBlue='\e[0;94m'        # Blu
IPurple='\e[0;95m'      # Viola
ICyan='\e[0;96m'        # Ciano
IWhite='\e[0;97m'       # Bianco

parse_git_branch() {
    git branch 2> /dev/null | sed -e '/^[^*]/d' -e 's/* \(.*\)/ ()/'
}
branch_color() {
    if git status | grep --quiet "nothing to commit"; then
        echo -e "$IBlue"
    else
        echo -e "$IRed"

    fi
}


PS1="\[$IGreen\]\u \[$ICyan\][\W]\[\$(branch_color)\]\$(parse_git_branch)\[$IWhite\] \n → "

Agora, o código imprime isso:

francesco [demo_app]\e[0;94m (master) 
→

onde francesco é meu nome de usuário, demo_app é a pasta e master é o ramo. a sequência \ e [0; 94m muda se eu criar um arquivo no diretório de trabalho, mas a cor não é analisada como você pode ver.

Então eu tentei mudar o PS1 assim:

PS1="\[$IGreen\]\u \[$ICyan\][\W]\[$(branch_color)\]\$(parse_git_branch)\[$IWhite\] \n → "

removendo o '\' antes (branch_color), e agora ele analisa a cor, mas ela não muda quando o status do diretório de trabalho é alterado.

Como posso resolver isso? Desculpe se não fui claro.

Francesco

    
por Francesco Zaffaroni 09.01.2014 / 20:56

1 resposta

0

O código que você tem funciona perfeitamente no meu Debian. Seu problema pode ser que echo do OSX não esteja imprimindo a sequência de escape corretamente.

Em geral, é melhor evitar echo e usar printf , pois sistemas diferentes têm implementações echo diferentes e isso pode afetar a portabilidade de seus scripts e causar outros problemas também. Veja aqui para (muito) mais detalhes.

De qualquer forma, tente substituir o echo s na sua função por 'printf:

branch_color() {
    if git status 2>/dev/null | grep --quiet "nothing to commit"; then
        printf "\e[0;94m"
    else
        printf "\e[0;91m"

    fi
}
PS1="\[$IGreen\]\u \[$ICyan\][\W]\[\$(branch_color)\]\$(parse_git_branch)\[$IWhite\] \n → "



PS1="\[$IGreen\]\u \[$ICyan\][\W]\[\$(branch_color)\]\$(parse_git_branch)\[$IWhite\] \n → "
    
por 10.01.2014 / 02:26

Tags