为什么我的功能未在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 2015年

Answers:


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,2015年

6

当你使用$(..)双引号,外壳分配给之前评价命令替换PS1。因此,PS1仅包含输出,而不包含命令替换本身。而是使用单引号,或转义$,以便将字符串原样传递给PS1,然后在设置提示时进行评估:

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

比较:

/var $ PS1="$(pwd) $ "
/var $ echo "$PS1"
a /var $  a
/var $ 
By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.