echo ponto de interrogação literal no PS1

4

Eu sou novo no shell de scripts e tentando fazer um bom prompt para me mostrar o estado do meu branch git, usando cores e caracteres como "?".

quando tenho novos arquivos não rastreados, quero que meu PS1 seja como:

p/a/t/h/ (staging ?) $

i.e. pwd (branchName space questionMark) $

Eu simplifiquei meu problema para este código (~ / .bashrc):

parseGitBranch () {
     gitBranch=staging
     ifUntrackedFiles="$gitBranch ?"
     echo $ifUntrackedFiles
 }

 PS1="'parseGitBranch' $ "

Meu problema é que, devido ao espaço antes do ponto de interrogação, o PS1 o trata como um caractere curinga e mostra que qualquer arquivo de uma única letra existe em meu diretório.

p/a/t/h/ (staging ?) touch a
p/a/t/h/ (staging ?) source ~/.bashrc
p/a/t/h/ (staging a) $

Sem o espaço, funciona bem, mas ainda quero o espaço depois do nome da minha agência: \

p/a/t/h/ (staging?) $

Eu também tentei:

ifUntrackedFiles="$gitBranch"' ?'

echo -e

e uma barra invertida antes que a marca mostre os dois (preparação \?)

Como escapar do ponto de interrogação no PS1?

Obrigado!

    
por Taitu-lism 14.12.2016 / 13:57

1 resposta

3

No shell Bourne, não citar uma variável (ou seja, $var em vez de "$var" ) deve ser a exceção. O problema aqui é o seu comando echo . Com echo ? , ? é substituído por cada arquivo de uma letra em seu diretório, enquanto com echo "?" , o ponto de interrogação é exibido como está.

Sua função deve então ser:

parseGitBranch () {
     gitBranch=staging
     ifUntrackedFiles="$gitBranch ?"
     echo "$ifUntrackedFiles"
 }

E, como as aspas são fáceis de confundir com aspas simples e difíceis de aninhar, use $(...) :

 PS1='$(parseGitBranch) $ '
    
por 14.12.2016 / 14:19

Tags