为什么我的功能没有在 PS1 中重新评估?

dar*_*ith 23 command-line bash prompt bashrc ps1

我正在尝试通过函数动态设置我的提示的一部分,所以在我的.bashrc我有:

asdf ()
{
    echo -n $(pwd)
}
PS1="\u@\h:\w $(asdf)\$ "
Run Code Online (Sandbox Code Playgroud)

打开一个 shell 给了我我最初的期望:

$ bash
darthbith@server:~/test /home/darthbith/test$
Run Code Online (Sandbox Code Playgroud)

但是,当我更改目录时,函数定义的部分不会改变:

darthbith@server:~/test /home/darthbith/test$ cd ~/test2
darthbith@server:~/test2 /home/darthbith/test$
Run Code Online (Sandbox Code Playgroud)

我的实际目标是当我使用漂亮的颜色和所有内容时,使用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)\$ "
Run Code Online (Sandbox Code Playgroud)

mgo*_*gor 27

根据Bash 提示 Howto

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

重要的是要注意命令替换的美元符号之前的反斜杠。没有它,外部命令只执行一次:当 PS1 字符串被读入环境时。


mur*_*uru 8

当您$(..)在双引号中使用时,shell 在分配给PS1. 因此,PS1只包含输出,而不包含命令替换本身。相反,要么使用单引号,要么转义$,以便字符串按原样传递给PS1,然后在设置提示时进行评估:

$ PS1='$(pwd) $ '
/tmp $ cd /var
/var $ echo "$PS1"
$(pwd) $ 
Run Code Online (Sandbox Code Playgroud)

相比:

/var $ PS1="$(pwd) $ "
/var $ echo "$PS1"
a /var $  a
/var $ 
Run Code Online (Sandbox Code Playgroud)