71

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
  • 2,454
  • 7
  • 27
  • 33
  • 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 Oct 22 '10 at 13:38
  • 3
    p.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 Oct 22 '10 at 13:54
  • @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 Oct 22 '10 at 17:15
  • `\u@\H[\w]:~\$` makes `user@host[~/path]:~$` – JREAM Jan 03 '19 at 17:10

5 Answers5

74

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
  • 21,379
  • 8
  • 74
  • 79
  • 4
    I 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 Oct 22 '10 at 15:47
  • Right, missed that \, I usually work with single quotes if it's possible. Thanks. – cYrus Oct 22 '10 at 16:06
  • +1 Thanks! could you please explain the magic in your beautiful bash line (the 'tip' one)? – David B Oct 22 '10 at 17:12
  • 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 Oct 22 '10 at 17:30
40

Put in your home .bashrc

PS1='\u@\h:\w\$ '
studiohack
  • 13,468
  • 19
  • 88
  • 118
Alex
  • 401
  • 4
  • 2
  • 12
    The key here is `\w` gives the full path while `\W` gives only the directory. See ["Bash Prompt Escape Sequences"](http://www.tldp.org/HOWTO/Bash-Prompt-HOWTO/bash-prompt-escape-sequences.html) – zamnuts May 04 '15 at 03:27
4

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
  • 27,333
  • 17
  • 78
  • 105
  • 2
    minor point: per google's bash style guide, prefer $(pwd) to backticks because backticks require escaping when nesting and $() doesn't. – funroll Apr 11 '13 at 19:19
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
  • 10,990
  • 6
  • 43
  • 57
  • 3
    I 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 Oct 22 '10 at 09:41
  • was the terminology in the url, not mine :) – Sirex Oct 22 '10 at 09:57
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
  • 1,449
  • 19
  • 25