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)\$ "
1

2 Answers 2

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.

1
  • 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, 2015 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 $ 

Your Answer

By clicking “Post Your Answer”, you agree to our terms of service and acknowledge that you have read and understand our privacy policy and code of conduct.

Not the answer you're looking for? Browse other questions tagged or ask your own question.