Gilles identificou seu principal problema, mas eu queria tentar explicá-lo de maneira diferente.
O Bash interpreta que o prompt especial escapa apenas antes de expandir quaisquer variáveis no prompt. Isso significa que o uso \e
de uma variável expandida a partir do prompt não funciona, mesmo que funcione diretamente PS1
.
Por exemplo, isso funciona conforme o esperado e fornece 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ê deseja armazenar as fugas de cor nas variáveis, é possível usar ANSI-C entre aspas ( $'...'
) para colocar um caractere de escape literal na variável.
Para fazer isso, você pode mudar a sua definição de GREEN
, RED
e NONE
, por isso, o seu valor é a seqüência de escape real.
GREEN=$'\033[1;32m'
RED=$'\033[1;31m'
NONE=$'\033[m'
Se você fizer isso, o primeiro PS1
com aspas simples deve funcionar:
PS1='${RED}\h $(get_path) ${exitStatus}${NONE} '
No entanto, você terá um segundo problema.
Tente executar isso, pressione e Up Arrow, em seguida Home, e seu cursor não retornará ao início da linha.
Para corrigir isso, altere PS1
para incluir \[
e \]
contornar as seqüências de escape de cores, por exemplo
PS1='\[${RED}\]\h $(get_path) $?\[${NONE}\] '
Você não pode usá-lo get_exit_status
corretamente aqui, pois a saída contém caracteres de impressão (o código de saída) e caracteres não imprimíveis (os códigos de cores), e não há como marcá-lo corretamente no prompt. A colocação \[...\]
marcaria como não imprimível na íntegra, o que não está correto. Você precisará alterar a função para que ela imprima apenas o código de cor adequado e, em seguida, coloque-a \[...\]
no prompt.
\[
é\1
e\[
é\2
. Aqueles corresponde a algo de alguma linha de leituraRL_PROMPT_{START,END}_IGNORE
que solicita que ele ignore os bytes ao contar o comprimento do prompt na tela. Consulte lists.gnu.org/archive/html/bug-bash/2015-08/msg00027.html .