How can I display the absolute path in bash prompt?

51

15

I currently have my bash PS1 set to something like this:

PS1="\[\`if [[ \$? = "0" ]]; then echo '\e[32m\h\e[0m'; else echo '\e[31m\h\e[0m' ; fi\`:\w\n\$ "

How can I make it show the absolute path instead of the relative one (e.g. /home/dave/dir instead of ~/dir)?

David B

Posted 2010-10-22T08:52:45.757

Reputation: 1 974

1/home/dave/dir and ~/dir are both absolute paths, the second uses an abbreviation for your home directory. A relative path is a path that is relative to your current directory (e.g. ../dir) rather than starting at root (/). – Doug Harris – 2010-10-22T13:38:47.863

3p.s. Nice use of color to indicate exit status of previous command. Probably the first use of color in a prompt that I've liked. – Doug Harris – 2010-10-22T13:54:31.643

@Doug Harris: Thanks for the correction. I like this coloring, too. Don't remember where I first saw it (perhaps in some previous SU post?) – David B – 2010-10-22T17:15:16.950

\u@\H[\w]:~\$ makes user@host[~/path]:~$ – JREAM – 2019-01-03T17:10:21.080

Answers

52

Just replace \w with \$PWD:

PS1="\[\`if [[ \$? = "0" ]]; then echo '\e[32m\h\e[0m'; else echo '\e[31m\h\e[0m' ; fi\`:\$PWD\n\$ "

Anyway if you mind a little tip, I'd write something like:

PS1='\[`[ $? = 0 ] && X=2 || X=1; tput setaf $X`\]\h\[`tput sgr0`\]:$PWD\n\$ '

cYrus

Posted 2010-10-22T08:52:45.757

Reputation: 18 102

4I thought of this, too, but the $PWD is evaluated at the time of the assignment to PS1, not on each call. However, if you escape the dollar sign, it will work -- \$PWD. With this, the dollar sign is a dollar sign at time of assignment and the variable evaluation happens on each prompt. +1 to you. – Doug Harris – 2010-10-22T15:47:47.613

Right, missed that , I usually work with single quotes if it's possible. Thanks. – cYrus – 2010-10-22T16:06:31.813

+1 Thanks! could you please explain the magic in your beautiful bash line (the 'tip' one)? – David B – 2010-10-22T17:12:47.293

Sure. I used tput (see man tput for more info) to change the colors rather than write the control characters directly, for readability and portability (?). Also I removed double quotes and back slashes by using single quotes. Finally by using a variable I avoided some redundancy. – cYrus – 2010-10-22T17:30:58.690

29

Put in your home .bashrc

PS1='\u@\h:\w\$ '

Alex

Posted 2010-10-22T08:52:45.757

Reputation: 291

7

The key here is \w gives the full path while \W gives only the directory. See "Bash Prompt Escape Sequences"

– zamnuts – 2015-05-04T03:27:08.873

0

in bash's ps1; -W should be relative, and -w absolute, so in the above you should already have the absolute ?!

http://wiki.archlinux.org/index.php/Color_Bash_Prompt

Sirex

Posted 2010-10-22T08:52:45.757

Reputation: 10 321

3I think you're confusing absolute|relative with full|current_dir. W shows only the current directory name, w shows the full path, but still uses relative paths. – David B – 2010-10-22T09:41:11.553

was the terminology in the url, not mine :) – Sirex – 2010-10-22T09:57:28.230

0

Humm ~/dir is an absolute path but using a "shortcut". For instance, if you do cd /usr/local your prompt will most probably display the full path of /usr/local. So anyway, you have already a full path :-)

But probably your correct question is how to display the full path without any shortcuts like ~?

However, I don't know an answer for that one and looking at the man, it does seem to have one (at least documented).

Huygens

Posted 2010-10-22T08:52:45.757

Reputation: 1 340

0

Run pwd instead of using \W.

Simple version:

export PS1="\`pwd\` $ "

Using this in your code:

export PS1="\[\`if [[ \$? = "0" ]]; then echo '\e[32m\h\e[0m'; else echo '\e[31m\h\e[0m' ; fi\`:\`pwd\`\n\$ "

Doug Harris

Posted 2010-10-22T08:52:45.757

Reputation: 23 578

1minor point: per google's bash style guide, prefer $(pwd) to backticks because backticks require escaping when nesting and $() doesn't. – funroll – 2013-04-11T19:19:48.420