Gerando o PS1 na função bash

0

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?

    
por Brett38 17.11.2017 / 18:03

2 respostas

-1

Na sua função nv_ps1 , tente com echo -e "3[${nv_color}m${nv_major}3[0m" , deve ser melhor

    
por 17.11.2017 / 18:21
1

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:

  • Exportar PS1 não é necessário.
  • É 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))
    
por 17.11.2017 / 21:27

Tags