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 /

回答:


22

Bash prompt Howtoによると:

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

コマンド置換のドル記号の前のバックスラッシュに注意することが重要です。これがない場合、外部コマンドは1回だけ実行されます。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 $ 
弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.