Почему моя функция не переоценивается в 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)\$ "
1
задан 23 July 2015 в 21:45

1 ответ

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

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

Сравнить:

/var $ PS1="$(pwd) $ "
/var $ echo "$PS1"
a /var $  a
/var $ 
5
ответ дан 23 May 2018 в 18:50

Другие вопросы по тегам:

Похожие вопросы: