эхо-буквенный знак вопроса в PS1

Я новичок в сценариях оболочки и пытаюсь сделать себе приятную подсказку, чтобы показать мне состояние моей ветки git, используя цвета и символы типа «?».

когда у меня есть новые файлы без следа, я хочу, чтобы мой PS1 был следующим:

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

т.е. pwd (branchName space questionMark) $

Я упростил свою проблему для этого кода (~ / .bashrc):

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

Моя проблема заключается в том, что из-за пробела перед вопросительным знаком PS1 рассматривает его как подстановочный знак и показывает, что в моем каталоге существует какой-либо файл с одной буквой.

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

Без пространства это работает хорошо, но я все еще хочу пространство после имени моей ветки: \

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

Я также пробовал:

 ifUntrackedFiles="$gitBranch"' ?' 

echo -e

и обратная косая черта перед меткой выводит их обе (постановка \?)

Как избежать вопросительного знака в PS1?

Благодаря!

Исключение составляет оболочка Bourne, а не цитирование переменной (т.е. $var вместо "$var" ). Проблема здесь в вашей команде echo . С echo ? , ? заменяется каждым однобуквенным файлом в вашем каталоге, тогда как с echo "?" , знак вопроса отображается как есть.

Ваша функция должна быть следующей:

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

И, поскольку обратные кавычки легко смешивать с одинарными кавычками и трудно вложить, вместо этого используйте $(...) :

  PS1='$(parseGitBranch) $ '