Чому моя функція не оцінюється в 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)\$ "

Зі сторони, якщо ви хочете підказати 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 читається в середовище.


Дякую! Тепер, якби тільки я міг змусити її друкувати кольори замість послідовностей евакуації, повернених із функції ...
darthbith

6

Коли ви використовувались $(..)у подвійних лапках, оболонка оцінювала підстановку команд перед призначенням PS1. Таким чином, PS1містився лише вихід, а не сама підміна команди. Натомість або використовуйте одинарні лапки, або біжіть $, щоб рядок передавались як є PS1, а потім оцінювали, коли запрошення встановлено:

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

Порівняйте:

/var $ PS1="$(pwd) $ "
/var $ echo "$PS1"
a /var $  a
/var $ 
Використовуючи наш веб-сайт, ви визнаєте, що прочитали та зрозуміли наші Політику щодо файлів cookie та Політику конфіденційності.
Licensed under cc by-sa 3.0 with attribution required.