Gilles identificou seu problema principal, mas eu queria tentar explicá-lo de maneira diferente.
O Bash interpreta o aviso especial que escapa somente antes expandindo quaisquer variáveis no prompt. Isso significa que usar \e
em uma variável que é expandida a partir do prompt não funciona, embora funcione diretamente em PS1
.
Por exemplo, isso funciona como esperado e fornece um texto em vermelho:
PS1='\e[1;31m this is in red '
Mas isso não acontece, apenas coloca um literal \e
no prompt:
RED='\e[1;31m'
PS1="$RED not in red "
Se você quiser armazenar as fugas de cor nas variáveis, você pode usar aspas ANSI-C ( $'...'
) para colocar um caractere de escape literal na variável.
Para fazer isso, você pode alterar sua definição de GREEN
, RED
e NONE
, de modo que seu valor seja a sequência de escape real.
GREEN=$'3[1;32m'
RED=$'3[1;31m'
NONE=$'3[m'
Se você fizer isso, seu primeiro PS1
com aspas simples deverá funcionar:
PS1='${RED}\h $(get_path) ${exitStatus}${NONE} '
No entanto, você terá um segundo problema.
Tente executá-lo, pressione Seta para cima , depois Início , e o cursor não voltará ao início da linha.
Para corrigir isso, altere PS1
para incluir \[
e \]
em torno das seqüências de escape de cores, por exemplo,
PS1='\[${RED}\]\h $(get_path) $?\[${NONE}\] '
Você não pode usar get_exit_status
corretamente aqui, pois sua saída contém os caracteres de impressão (o código de saída) e não-impressão (os códigos de cores) e não há como marcá-lo corretamente no prompt. Colocar \[...\]
marcaria como não impressa na íntegra, o que não está correto. Você terá que alterar a função para que ela imprima apenas o código de cor apropriado e, em seguida, coloque-a com \[...\]
no prompt.