Hide current working directory in terminal

As a default, the terminal prompt shows something like:

user@system:/folder1/folder2/folder3/folder4$

the deeper you go into the filesystem, the less space is left for typing in commands. Can I change this to only show something like:

>

I mean, I can just type pwd to show where I am at. ;)


Solution 1:

export PS1='\u@\h: '

That results in oli@bert: for my prompt.

If you really want something as minimalist as you ask for, try this:

export PS1='> '

You can attach that to the end of your ~/.bashrc file to have it persist between logins.

You can also get creative with some colours. Here's what I use on my servers:

export PS1='\[\033[0;35m\]\h\[\033[0;33m\] \w\[\033[00m\]: '

Giving (it's easier to see on a full black background):

My terminals

Glossary of acceptable characters in PS1

Solution 2:

Just to expand on Oli's answer (and so that I have a bookmark for those short-hand symbols):

The bash prompt (stefano@linux:~$) is only the first of a couple of prompts you might see:

  • PS1: the default prompt you see when you open a shell

    It's value is stored in an environment variable called PS1. To see its value, type

    echo $PS1

    This will give you something like

    \[\e]0;\u@\h: \w\a\]${debian_chroot:+($debian_chroot)}\u@\h:\w\$
    

    To change it, you can set a new value for the variable:

    export PS1="\u > "
    

    This will result in a prompt like this:

    stefano > 
    
  • PS2: is your secondary prompt. This gets shown when a command is not finished. Type echo "asd and hit enter, the secondary prompt will let you enter more lines until you close the inverted commas.

  • PS3 is the prompt used for select(2)

  • PS4 is the prompt used for alt textstack traces (default: +)

To make the changes permanent, you append them to the end of .bash_profile (or .bashrc, see this question) in your home directory.

Here's a more or less complete list of shorthand that you can use when composing these:

  • \a     The 'bell' character
  • \A     24h Time
  • \d     Date (e.g. Tue Dec 21)
  • \e     The 'escape' character
  • \h     Hostname (up to the first ".")
  • \H     Hostname
  • \j     No. of jobs currently running (ps)
  • \l     Current tty
  • \n     Line feed
  • \t     Time (hh:mm:ss)
  • \T     Time (hh:mm:ss, 12h format)
  • \r     Carriage return
  • \s     Shell (i.e. bash, zsh, ksh..)
  • \u     Username
  • \v     Bash version
  • \V     Full Bash release string
  • \w     Current working directory
  • \W     Last part of the current working directory
  • \!     Current index in history
  • \#     Command index
  • \$     A "#" if you're root, else "$"
  • \\     Literal Backslash
  • \@     Time (12h format with am/pm)

You can of course insert any literal string, and any command:

export PS1="\u \$(pwd) > "

Where $(pwd) stands in place of "the output of" pwd.

  • If the command substitution is escaped, as in \$(pwd), it's evaluated every time the prompt is displayed, otherwise, as in $(pwd), it's only evaluated once when bash is started.

If you want your prompt to feature colours, you can use bash's colour codes to do it. The code consists of three parts:

40;33;01
  • The first part before the semicolon represents the text style.

    • 00=none
    • 01=bold
    • 04=underscore
    • 05=blink
    • 07=reverse
    • 08=concealed
  • The second and third part are the colour and the background color:

    • 30=black
    • 31=red
    • 32=green
    • 33=yellow
    • 34=blue
    • 35=magenta
    • 36=cyan
    • 37=white

Each part can be omitted, assuming starting on the left. i.e. "1" means bold, "1;31" means bold and red. And you would get your terminal to print in colour by escaping the instruction with \33[ and ending it with an m. 33, or 1B in hexadecimal, is the ASCII sign "ESCAPE" (a special character in the ASCII character set). Example:

"\33[1;31mHello World\33[m"

Prints "Hello World" in bright red.

Solution 3:

Another alternative is to shorten the working directory path when it gets too long: trim the terminal command prompt working directory

Create a small python script which implements the desired trimming logic.

Example: ~/short.pwd.py

import os
from commands import getoutput
from socket import gethostname
hostname = gethostname()
username = os.environ['USER']
pwd = os.getcwd()
homedir = os.path.expanduser('~')
pwd = pwd.replace(homedir, '~', 1)
if len(pwd) > 30:
    pwd = pwd[:10]+'...'+pwd[-20:] # first 10 chars+last 20 chars
print '[%s@%s:%s] ' % (username, hostname, pwd)

Now test it, from a terminal:

export PROMPT_COMMAND='PS1="$(python ~/.short.pwd.py)"'

If you are ok with the result just append the command into your ~/.bashrc

Solution 4:

I often want to do this temporarily. Here's what I do:

$ export OLD_PS1=$PS1                    # save Long Prompt to OLD_PS1
$ export PS1="\u > "export PS1="\u $ "   # change to PS1 to Short Prompt
$ export PS1=$OLD_PS1                    # restore Long Prompt to PS1

I hope this helps someone.

Solution 5:

for macOS users:

open ~/.bash_profile

at the end of the file add the following line and save it

export PS1='\u:\w\$ '

result at home directory:

user: ~$

here u for user w for current working directory $ is to prompt to display

you can try the following styles:

export PS1='$ '

to just have $ as prompt, nothing else. just like:

$