Na sua função nv_ps1
, tente com echo -e "3[${nv_color}m${nv_major}3[0m"
, deve ser melhor
Eu quero mostrar a versão do Node no meu prompt de comando bash. Eu criei uma função para gerar essa parte do PS1. Obtém a versão principal do Node e a colore com base em seu valor numérico. No meu .bash_profile
:
nv_ps1 () {
nv_re="v([0-9]+)\.[0-9]+\.[0-9]"
if [[ $($NVM_BIN/node --version) =~ $nv_re ]]; then
nv_major=${BASH_REMATCH[1]}
let nv_color=$nv_major+26
echo "\[\e[${nv_color}m\]$nv_major\[\e[m\]"
fi
}
export PS1="[\$(nv_ps1) \[\e[36m\]\t\[\e[m\] \W]\$ "
As seqüências de escape na saída da função não são avaliadas, e o prompt de comando termina assim:
[\[\e[34m\]8\[\e[m\] 08:54:58 ~]$
Como posso fazer isso funcionar?
O shell avalia caracteres de escape antes de executar o comando nv_ps1 . Portanto, este comando não deve gerar caracteres de escape, eles serão exibidos apenas textualmente. Códigos Ascii (cores) podem ser produzidos por nv_ps1 se você os converter antes, é por isso que echo -e
parece ser suficiente. Mas \[
e \]
são específicos da interpretação PS1 , você não tem como liberá-los da sua função. Você pode ignorar isso, mas pode ficar desapontado mais cedo ou mais tarde.
A solução mais simples é export PS1="[$(nv_ps1) \[\e[36m\]\t\[\e[m\] \W]\$ "
. Assim, os caracteres escapados são armazenados diretamente em PS1 na atribuição.
Vantagem: Avalie apenas nv_ps1 uma vez, para que o shell não bifurque em todas as solicitações.
Desvantagem: Avalie apenas nv_ps1 uma vez, portanto, se o Nó for atualizado, o prompt de shells aberto no momento não (mas você pode source ~/.bashrc
).
Se você realmente deseja manter o prompt atualizado, você deve ter duas chamadas de funções export PS1="[\[\$(nv_ps1 color)\]\$(nv_ps1 version)\[\e[m\] \[\e[36m\]\t\[\e[m\] \W]\$ "
e colocar isso na sua função [[ $1 == color ]] && printf "\e[${nv_color}m" || printf "${nv_major}"
.
Notas laterais:
É preferível usar variáveis locais:
local nv_re="v([0-9]+)\.[0-9]+\.[0-9]"
local nv_major="${BASH_REMATCH[1]}"
local nv_color=$((nv_major + 26))