Linux shell/Bash prompt PS1, settings and history

From Ever changing code
Jump to navigation Jump to search

Add git branch and colour to bash prompt

This are steps to set up bash prompt showing git branch. This has been tested in Ubuntu 14lts, 16.04

Edit vi ~/.bashrc

  1. Uncomment #force_color_prompt=yes
    sed -i -E 's/^#(force_color_prompt=yes)/\1/g' ~/.bashrc
  2. Find if [ "$color_prompt" = yes ]; then statement
  3. then comment out #PS1= and add following code in bold
if [ "$color_prompt" = yes ]; then
        parse_git_branch() { git branch 2> /dev/null | sed -e '/^[^*]/d' -e 's/* \(.*\)/ (\1)/'; }
        PS1="\u@\h \[\033[32m\]\w\[\033[33m\]\$(parse_git_branch)\[\033[00m\] $ "
       #PS1='${debian_chroot:+($debian_chroot)}\[\033[01;32m\]\u@\h\[\033[00m\]:\[\033[01;34m\]\w\[\033[00m\]\$ ' #default colour prompt
else
    PS1='${debian_chroot:+($debian_chroot)}\u@\h:\w\$ '
fi

It will similar to

Git branch in bash prompt

Reload shell without logging out

. ~/.bashrc
source ~/.bashrc
exec bash
exec "$BASH"

Differences

  • source ~/.bashrc will preserve your current shell. Except for the modifications that reloading ~/.bashrc into the current shell (sourcing) makes, the current shell and its state are preserved, which includes environment variables, shell variables, shell options, shell functions, and command history.
  • exec bash, or, more robustly, exec "$BASH"[1], will replace your current shell with a new instance, and therefore only preserve your current shell's environment variables (including ones you've defined ad-hoc). In other words: Any ad-hoc changes to the current shell in terms of shell variables, shell functions, shell options, command history are lost.

[1] exec bash could in theory execute a different bash executable than the one that started the current shell, if it happens to exist in a directory listed earlier in the $PATH. Since special variable $BASH always contains the full path of the executable that started the current shell, exec "$BASH" is guaranteed to use the same executable.

Bash coloured autocomplete of symlinks

Use bash --version | grep release to find out what version of Bash you are using.

To configure it add lines below to your ~/.inputrc or system-wide /etc/inputrc

Bash 4.3 readline adds a variable that enables color for tab completion to show different colors for executable files, directories, etc., during tab completion. Readline in the upcoming Bash 4.4 adds a variable which enables colour to indicate the matching portion of the string during tab completion.

set colored-stats on             #bash 4.3
set colored-completion-prefix on #bash >=4.4

You can see the values of these variables using

bind -v | grep color

Bash autocomplete the common string with ellipses

Add to your ~/.inputrc or system-wide /etc/inputrc file

set completion-prefix-display-length 2

When you TAB to autocomplete the common string if it's longer than 2 characters will be replaced with (...) ellipses

Bash-autocomplete-common-string-into-ellipses

Bash key binding

  • Readline This is what allows for all bash keybindings, colouring etc..

Bash history

To persist your history and write every command to the file add below do the end of your .bashrc

If Ubuntu user comment out these 2

# HISTSIZE=1000
# HISTFILESIZE=2000

Add at the end of your .bashrc

# Eternal bash history.
# ---------------------
export HISTFILESIZE=10000
export HISTSIZE=10000
export HISTTIMEFORMAT="[%F %T] "
export HISTFILE=~/.bash_eternal_history
# Force prompt to write history after every command.
PROMPT_COMMAND="history -a; $PROMPT_COMMAND"

Copy current history to new history file

$ cat ~/.bash_history >>~/.bash_eternal_history

Resources