26

I'm trying to have a part of my prompt set dynamically by a function, so in my .bashrc I have:

asdf ()
{
    echo -n $(pwd)
}
PS1="\u@\h:\w $(asdf)\$ "

Opening a shell gives me what I expect at first:

$ bash
darthbith@server:~/test /home/darthbith/test$

However, when I change directory, the part defined by the function doesn't change:

darthbith@server:~/test /home/darthbith/test$ cd ~/test2
darthbith@server:~/test2 /home/darthbith/test$

My actual goal is to use the git-prompt.sh script to show the branch of my git repository when I'm in one with pretty colors and everything, but the problem is that it never updates the branch name when I change repositories. The trivial example above is the simplest reproduction I could come up with for my question.

The .bashrc lines that I have to integrate the git-prompt script:

source ~/.git-prompt.sh
PS1="\[\033[01;32m\]\u@\h\[\033[00m\]:\[\033[01;34m\]\w\[\033[00m\]$(__git_ps1)\$ "
wjandrea
  • 14,109
  • 4
  • 48
  • 98
darthbith
  • 374
  • 3
  • 12
  • On a side note, if you want a git prompt I would recommend https://github.com/magicmonty/bash-git-prompt/blob/master/README.md – mgor Jul 23 '15 at 18:38

2 Answers2

31

According to Bash prompt Howto:

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

It's important to notice the backslash before the dollar sign of the command substitution. Without it, the external command is executed exactly once: when the PS1 string is read into the environment.

wjandrea
  • 14,109
  • 4
  • 48
  • 98
mgor
  • 1,191
  • 7
  • 12
  • Thank you! Now if only I could get it to print the colors instead of the escape sequences returned from the function... – darthbith Jul 23 '15 at 20:23
9

When you used $(..) in double-quotes, the shell evaluated the command substitution before assigning to PS1. Thus, PS1 contained only the output, not the command substitution itself. Instead, either use single-quotes, or escape the $, so that the string is passed as-is to PS1, and then evaluated when the prompt is set:

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

Compare:

/var $ PS1="$(pwd) $ "
/var $ echo "$PS1"
a /var $  a
/var $ 
muru
  • 193,181
  • 53
  • 473
  • 722