Skip to main content
Delete function when used; show some more Bash overrides
Source Link
Toby Speight
  • 88.4k
  • 14
  • 104
  • 327
local WHOAMI=$(whoami)
local WHERE='$(pwd)'
local HOSTNAME=$(hostname)
local DATE='$(date +%Y-%m-%d\ %H:%M:%S)'
local LAST_RET='${?#0}'

if [ ${BASH_VERSION:-} ]
then
    # Bash-specific overrides
    WHOAMI='\u'
    WHERE='\w'
    HOSTNAME='\h'
    DATE='\D{%Y-%m-%d %H:%M:%S}'
fi 

# Now combine into lines
local LINE_1="$YELLOW$DATE $GREEN$WHOAMI$RED@$CYAN$HOSTNAME $BLUE$BOLD$WHERE$RESET"
local LINE_2="$MAGENTABG$LAST_RET$RESET"'\$ '

if [ ${BASH_VERSION:-} ]
then
    # Indicate non-spacing output for Bash readline
    LINE_2="\\[$MAGENTABG\\]$LAST_RET\\[$RESET\\]"'\$ '
fi

PS1="$LINE_1\n$LINE_2"
local WHOAMI=$(whoami)
local WHERE='$(pwd)'
local HOSTNAME=$(hostname)
local DATE='$(date +%Y-%m-%d\ %H:%M:%S)'
local LAST_RET='${?#0}'

if [ ${BASH_VERSION:-} ]
then
    # Bash-specific overrides
    WHOAMI='\u'
    WHERE='\w'
    HOSTNAME='\h'
    DATE='\D{%Y-%m-%d %H:%M:%S}'
fi
local WHOAMI=$(whoami)
local WHERE='$(pwd)'
local HOSTNAME=$(hostname)
local DATE='$(date +%Y-%m-%d\ %H:%M:%S)'
local LAST_RET='${?#0}'

if [ ${BASH_VERSION:-} ]
then
    # Bash-specific overrides
    WHOAMI='\u'
    WHERE='\w'
    HOSTNAME='\h'
    DATE='\D{%Y-%m-%d %H:%M:%S}'
fi 

# Now combine into lines
local LINE_1="$YELLOW$DATE $GREEN$WHOAMI$RED@$CYAN$HOSTNAME $BLUE$BOLD$WHERE$RESET"
local LINE_2="$MAGENTABG$LAST_RET$RESET"'\$ '

if [ ${BASH_VERSION:-} ]
then
    # Indicate non-spacing output for Bash readline
    LINE_2="\\[$MAGENTABG\\]$LAST_RET\\[$RESET\\]"'\$ '
fi

PS1="$LINE_1\n$LINE_2"
added 28 characters in body
Source Link
Toby Speight
  • 88.4k
  • 14
  • 104
  • 327
    local WHOAMI='\u'
    local WHERE='\w'
    local HOSTNAME='\h'
    local DATE='\D{%Y-%m-%d %H:%M:%S}'
    local LAST_RET='${?#0}'

    local LINE_1="$YELLOW$DATE $GREEN$WHOAMI$RED@$CYAN$HOSTNAME $BLUE$BOLD$WHERE$RESET"
    local LINE_2="\\[$MAGENTABG\\]$LAST_RET\\[$RESET\\]"'\$ '

    PS1="$LINE_1\n$LINE_2" 

    unset -f set_PS1
}

set_PS1
    local WHOAMI='\u'
    local WHERE='\w'
    local HOSTNAME='\h'
    local DATE='\D{%Y-%m-%d %H:%M:%S}'
    local LAST_RET='${?#0}'

    local LINE_1="$YELLOW$DATE $GREEN$WHOAMI$RED@$CYAN$HOSTNAME $BLUE$BOLD$WHERE$RESET"
    local LINE_2="\\[$MAGENTABG\\]$LAST_RET\\[$RESET\\]"'\$ '

    PS1="$LINE_1\n$LINE_2"
}

set_PS1
    local WHOAMI='\u'
    local WHERE='\w'
    local HOSTNAME='\h'
    local DATE='\D{%Y-%m-%d %H:%M:%S}'
    local LAST_RET='${?#0}'

    local LINE_1="$YELLOW$DATE $GREEN$WHOAMI$RED@$CYAN$HOSTNAME $BLUE$BOLD$WHERE$RESET"
    local LINE_2="\\[$MAGENTABG\\]$LAST_RET\\[$RESET\\]"'\$ '

    PS1="$LINE_1\n$LINE_2" 

    unset -f set_PS1
}

set_PS1
Added "Notes on portability" section
Source Link
Toby Speight
  • 88.4k
  • 14
  • 104
  • 327

#Notes on portability What I've written above is a straight Bash answer; my personal preference for PS1 is for it to be different for each shell, so I'm reminded which one I'm in. Thus, absolute consistency is an explicit non-goal for me.

However, the principle of creating local variables for the elements of the prompt works well for portability: we can isolate the shell-specific parts like this:

local DATE='\D{%Y-%m-%d %H:%M:%S}'
test ${BASH_VERSION+1} || DATE='$(date +%Y-%m-%d\ %H:%M:%S)'

or

local WHOAMI=$(whoami)
local WHERE='$(pwd)'
local HOSTNAME=$(hostname)
local DATE='$(date +%Y-%m-%d\ %H:%M:%S)'
local LAST_RET='${?#0}'

if [ ${BASH_VERSION:-} ]
then
    # Bash-specific overrides
    WHOAMI='\u'
    WHERE='\w'
    HOSTNAME='\h'
    DATE='\D{%Y-%m-%d %H:%M:%S}'
fi

#Afterthought I should have used lowercase for the variable names above: that is the easiest way to ensure no conflict with the shell's own variables or with well-known environment variables.

#Notes on portability What I've written above is a straight Bash answer; my personal preference for PS1 is for it to be different for each shell, so I'm reminded which one I'm in. Thus, absolute consistency is an explicit non-goal for me.

However, the principle of creating local variables for the elements of the prompt works well for portability: we can isolate the shell-specific parts like this:

local DATE='\D{%Y-%m-%d %H:%M:%S}'
test ${BASH_VERSION+1} || DATE='$(date +%Y-%m-%d\ %H:%M:%S)'

or

local WHOAMI=$(whoami)
local WHERE='$(pwd)'
local HOSTNAME=$(hostname)
local DATE='$(date +%Y-%m-%d\ %H:%M:%S)'
local LAST_RET='${?#0}'

if [ ${BASH_VERSION:-} ]
then
    # Bash-specific overrides
    WHOAMI='\u'
    WHERE='\w'
    HOSTNAME='\h'
    DATE='\D{%Y-%m-%d %H:%M:%S}'
fi

#Afterthought I should have used lowercase for the variable names above: that is the easiest way to ensure no conflict with the shell's own variables or with well-known environment variables.

Properly quote \$
Source Link
Toby Speight
  • 88.4k
  • 14
  • 104
  • 327
Loading
I screwed up the PWD bit
Source Link
Toby Speight
  • 88.4k
  • 14
  • 104
  • 327
Loading
Source Link
Toby Speight
  • 88.4k
  • 14
  • 104
  • 327
Loading