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.
Here's a workaround, if you're willing to change your habits a little.
First of all, pick a directory in your PATH that you can write to.
Assuming that you're on your own machine, and you have admin rights,
you could use \Windows
or \Program Files\something
.
But it's probably better
to use something like\Users\username\bin
.
(Add it to your PATH if you don't already have it there.)
Then create a file there called CH.BAT
, or something like that,
with the following contents:
@echo off
REM Pass the argument(s) to the real "cd". If it fails, don't do anything else.
cd %* || exit /b
REM Get our current directory name.
set "dirname=%CD%"
:loop
REM Strip off one directory level -- remove everything through the first \.
set "remove_one=%dirname:*\=%"
REM If there's nothing left, that means dirname ENDS with a \.
REM The only (?) way this can happen is if it is the root directory
REM of a filesystem (partition), e.g., C:\.
REM In this case, set the prompt to the normal thing, C:\>.
if "%remove_one%" == "" goto exit_loop
REM If "%remove_one%" == "%dirname%", that means we are down to
REM the last directory name (i.e., there are no backslashes left).
if "%remove_one%" == "%dirname%" goto exit_loop
set "dirname=%remove_one%"
REM Keep on removing levels until we get to the bottom.
goto loop
:exit_loop
REM To handle the case where a directory name contains dollar sign(s)
REM (e.g., $P$G), replace each $ with $$ to remove its special meaning
REM in the prompt, and just display a $.
set "dirname=%dirname:$=$$%"
prompt %dirname%$G
And then get into the habit of typing ch
instead of cd
(or chdir
, if you're old enough to remember its original name
(which is still supported)).
I believe that the comments explain it fairly well, but, to recapitulate:
- Invoke
cd
on the command-line argument(s).
If it fails, exit the script.
- Use variable substitution
(
%varname:old=new%
)
to strip off directory levels.
Loop until there's nothing left to do.
If the current directory is the root (e.g., C:\
),
then the prompt will be C:\>
(since you didn't specify how to handle that case).
If it is something like C:\top\outer\middle\inner
,
you will get inner>
, as requested.
- As we know, dollar signs are special in the prompt.
But they are legal in directory names.
You can escape dollar signs in the prompt by doubling them;
i.e., if you put
$$
in the prompt, it will display as $
.
So we replace all dollar sign(s) in the directory name
with $$
to get them to display correctly.
- The script hard-codes the current directory name into the prompt string,
so, if you subsequently accidentally type
cd
instead of ch
,
your prompt will not change.
If this happens, just type ch
(or ch .
)
to set the prompt based on the new current directory.
- If you ever want to see the full pathname of your current directory,
type
cd
(or echo %CD%
).
- I have tested this with directory names that contain spaces
(and dollar signs), but I haven't tested every legal character.
Please let me know if you find a problem.
Naturally, it does no good to name the script CD.BAT
or CHDIR.BAT
,
because CMD.EXE always interprets cd
and chdir
as the “change directory” built-in command.
You can run such a script by typing its pathname,
but obviously that’s infeasible (from a workflow perspective)
as an override/replacement for cd
.
Best Answer
You can use the
prompt
command, which changes the displayed prompt.Type
prompt /?
and you will get this:If command extensions are enabled, there are a few more options, but these are the relevant ones.
In case you were wondering, the default prompt is:
prompt $P$G
,and a BASH style prompt is:
prompt $$
.The one that I use when I'm working in long directories is
prompt $G
, which is simply '>
'.Although there is no way to display just the current folder, you can always use
dir
to display folder information, including the path