Почему моя функция не переоценивается в PS1?
Я пытаюсь, чтобы часть моего приглашения была установлена динамически с помощью функции, поэтому в моем .bashrc
Я имею:
asdf ()
{
echo -n $(pwd)
}
PS1="\u@\h:\w $(asdf)\$ "
Открытие оболочки дает мне то, что я ожидаю сначала:
$ bash
darthbith@server:~/test /home/darthbith/test$
Однако, когда я меняю каталог, часть, определенная функцией, не меняется:
darthbith@server:~/test /home/darthbith/test$ cd ~/test2
darthbith@server:~/test2 /home/darthbith/test$
Моя настоящая цель - использовать git-prompt.sh
Скрипт, чтобы показать ветку моего репозитория git, когда я в одном, с красивыми цветами и всем остальным, но проблема в том, что он никогда не обновляет имя ветки, когда я меняю репозитории. Тривиальный пример выше - самое простое воспроизведение, которое я мог придумать для моего вопроса.
.bashrc
Строки, которые я должен интегрировать в скрипт git-prompt:
source ~/.git-prompt.sh
PS1="\[\033[01;32m\]\u@\h\[\033[00m\]:\[\033[01;34m\]\w\[\033[00m\]$(__git_ps1)\$ "
2 ответа
Согласно Bash подскажите Howto:
[21:58:33][giles@nikola:~]$ PS1="[\$(date +%H%M)][\u@\h:\w]\$ " [2159][giles@nikola:~]$ ls bin mail [2200][giles@nikola:~]$
Важно отметить обратную косую черту перед знаком доллара подстановки команд. Без этого внешняя команда выполняется ровно один раз: когда строка PS1 считывается в среду.
Когда вы использовали $(..)
в двойных кавычках оболочка оценивала подстановку команд перед назначением PS1
, Таким образом, PS1
содержит только вывод, а не саму подстановку команд. Вместо этого используйте либо одинарные кавычки, либо экранируйте $
, так что строка передается как есть PS1
, а затем оценивается, когда подсказка установлена:
$ PS1='$(pwd) $ '
/tmp $ cd /var
/var $ echo "$PS1"
$(pwd) $
Для сравнения:
/var $ PS1="$(pwd) $ "
/var $ echo "$PS1"
a /var $ a
/var $