command line - How do I show the real current directory in my bash prompt, not the symlink
2013-12
I use the default value of PS1 shipped with Ubuntu:
\[\033[01;32m\]\u@\h\[\033[00m\]:\[\033[01;34m\]\w\[\033[00m\]$
which is ok 90% of the time. However, when I cd
to a symlink "directory" the name of the symlink, not the value of pwd -P
is used.
How can I change the \w to get the real current directory? And still display with the format presented by \w
or \W
?
Use $(pwd -P)
instead of \w
. Like this:
PS1='\[\033[01;32m\]\u@\h\[\033[00m\]:\[\033[01;34m\]$(pwd -P)\[\033[00m\]$ '
To expand on hek2mgl's answer, to make your prompt "automatic", use the PROMPT_COMMAND
variable:
PROMPT_COMMAND='PS1="\[\033[01;32m\]\u@\h\[\033[00m\]:\[\033[01;34m\]$(pwd -P)\[\033[00m\]\$ "'
From the manual:
PROMPT_COMMAND
If set, the value is interpreted as a command to execute before the printing of each primary prompt ($PS1).
The way my bash prompt is currently configured, it shows the whole path to the current directory. This is annoying when I'm deep inside a directory tree, as the prompt becomes so long that every command wraps into the next line. How do I make it show only the last part of the path?
This is what I have in my .bashrc
:
PS1='${debian_chroot:+($debian_chroot)}\[\033[01;32m\]\u@\h\[\033[00m\]:\[\033[01;34m\]\w\[\033[00m\]\$ '
# If this is an xterm set the title to user@host:dir
case "$TERM" in
xterm*|rxvt*)
PROMPT_COMMAND='echo -ne "\033]0;${USER}@${HOSTNAME}: ${PWD/$HOME/~}\007"'
;;
*)
;;
esac
Change the \w
(lowercase) to \W
(uppercase):
PS1='${debian_chroot:+($debian_chroot)}\[\033[01;32m\]\u@\h\[\033[00m\]:\[\033[01;34m\]\W\[\033[00m\]\$ '
^^
this one waaaaaay over here ------------------------------------------------+
Have a look at the Bash Prompt HOWTO for lots of fun details. example:
user@host:/usr/local/bin$ echo $PS1
${debian_chroot:+($debian_chroot)}\[\033[01;31m\]\u@\h\[\033[00m\]:\[\033[01;36m\]\w\[\033[00m\]\$
user@host:/usr/local/bin$ export PS1='${debian_chroot:+($debian_chroot)}\[\033[01;31m\]\u@\h\[\033[00m\]:\[\033[01;36m\]\W\[\033[00m\]\$ '
user@host:bin$
The PROMPT_COMMAND
variable, if set, is a command that gets run before displaying the prompt specified in PS1
. In your case, PROMPT_COMMAND
runs an echo
statement with certain ANSI escape sequences that manipulate the titlebar of an Xterm.
If you suspect your PROMPT_COMMAND
is overriding your PS1
prompt, you can unset
it and test things out:
$ unset PROMPT_COMMAND
Finally, be sure that you're changing the PS1
definition that actually gets used. Common locations are /etc/bash.bashrc
, /etc/profile
, ~/.bashrc
, ~/.bash_profile
, ~/.profile
. The system files are generally (but not always) run before the user files.