Почему моя функция не переоценивается в PS1?

15

Я пытаюсь, чтобы часть моего приглашения была установлена ​​динамически с помощью функции, поэтому в моем .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-приглашение сценарий:

source ~/.git-prompt.sh
PS1="\[\033[01;32m\]\u@\h\[\033[00m\]:\[\033[01;34m\]\w\[\033[00m\]$(__git_ps1)\$ "
darthbith
источник
На заметку: если вам нужна подсказка git, я бы порекомендовал github.com/magicmonty/bash-git-prompt/blob/master/README.md
mgor,

Ответы:

22

Согласно Bash подскажите Howto :

[21:58:33][giles@nikola:~]$ PS1="[\$(date +%H%M)][\u@\h:\w]\$ "
[2159][giles@nikola:~]$ ls
bin   mail
[2200][giles@nikola:~]$

Важно заметить обратную косую черту перед знаком доллара подстановки команд. Без этого внешняя команда выполняется ровно один раз: когда строка PS1 считывается в среду.

МГор
источник
Спасибо! Теперь, если бы я только мог заставить его печатать цвета вместо escape-последовательностей, возвращаемых из функции ...
Дартбит с
6

При использовании $(..)в двойных кавычках оболочка оценивала подстановку команд перед назначением PS1. Таким образом, PS1содержится только вывод, а не сама подстановка команд. Вместо этого либо используйте одинарные кавычки, либо экранируйте $, чтобы строка передавалась как есть PS1, а затем вычислялась, когда задано приглашение:

$ PS1='$(pwd) $ '
/tmp $ cd /var
/var $ echo "$PS1"
$(pwd) $ 

Для сравнения:

/var $ PS1="$(pwd) $ "
/var $ echo "$PS1"
a /var $  a
/var $ 
Мур
источник