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.