我正在尝试通过函数动态设置提示的一部分,因此.bashrc
我有:
asdf ()
{
echo -n $(pwd)
}
PS1="\u@\h:\w $(asdf)\$ "
打开 shell 得到的是最初期望的结果:
$ 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
根据Bash 提示符操作方法:
[21:58:33][giles@nikola:~]$ PS1="[\$(date +%H%M)][\u@\h:\w]\$ " [2159][giles@nikola:~]$ ls bin mail [2200][giles@nikola:~]$
需要注意的是命令替换的美元符号前的反斜杠。如果没有它,外部命令只会执行一次:当 PS1 字符串被读入环境时。
答案2
当您使用$(..)
双引号时,shell 会在赋值给 之前评估命令替换PS1
。因此,PS1
仅包含输出,而不包含命令替换本身。相反,要么使用单引号,要么转义$
,以便将字符串按原样传递给PS1
,然后在设置提示时进行评估:
$ PS1='$(pwd) $ '
/tmp $ cd /var
/var $ echo "$PS1"
$(pwd) $
比较:
/var $ PS1="$(pwd) $ "
/var $ echo "$PS1"
a /var $ a
/var $