Logo Questions Linux Laravel Mysql Ubuntu Git Menu
 

Simplifying advanced Bash prompt variable (PS1) code

Tags:

bash

ps1

So I've found the following cool Bash prompt:

Bash prompt

..with the very basic logic of:

PS1="\[\033[01;37m\]\$? \$(if [[ \$? == 0 ]]; then echo \"\[\033[01;32m\]\342\234\223\"; else echo \"\[\033[01;31m\]\342\234\227\"; fi) $(if [[ ${EUID} == 0 ]]; then echo '\[\033[01;31m\]\h'; else echo '\[\033[01;32m\]\u@\h'; fi)\[\033[01;34m\] \w \$\[\033[00m\] "

However, this is not very basic and happens to be an incredible mess. I'd like to make it more readable.

How?

like image 482
Det Avatar asked Mar 12 '14 19:03

Det


People also ask

What is the PS1 variable in Linux?

PS1 is one of the few variables used by the shell to generate the prompt. As explained in the bash manual, PS1 represents the primary prompt string (hence the “PS”) - which is what you see most of the time before typing a new command in your terminal.

Which environment variable is used to customize the shell prompt options PS1 prompt shell display?

PS1: environment variable which contains the value of the default prompt. It changes the shell command prompt appearance and environment. PS2: environment variable which contains the value the prompt used for a command continuation interpretation.

What is Prompt_command?

Bash provides an environment variable called PROMPT_COMMAND. The contents of this variable are executed as a regular Bash command just before Bash displays a prompt.

Which prompt variable is used with the Select command structure?

The default is > PS3 – The value of this parameter is used as the prompt for the select command.


1 Answers

Use PROMPT_COMMAND to build the value up in a sane fashion. This saves a lot of quoting and makes the text much more readable. Note that you can use \e instead of \033 to represent the escape character inside a prompt.

set_prompt () {
    local last_command=$?  # Must come first!
    PS1=""
    # Add a bright white exit status for the last command
    PS1+='\[\e[01;37m\]$? '
    # If it was successful, print a green check mark. Otherwise, print
    # a red X.
    if [[ $last_command == 0 ]]; then
        PS1+='\[\e[01;32m\]\342\234\223 '
    else
        PS1+='\[\e[01;31m\]\342\234\227 '
    fi
    # If root, just print the host in red. Otherwise, print the current user
    # and host in green.
    # in 
    if [[ $EUID == 0 ]]; then
        PS1+='\[\e[01;31m\]\h '
    else
        PS1+='\[\e[01;32m\]\u@\h '
    fi
    # Print the working directory and prompt marker in blue, and reset
    # the text color to the default.
    PS1+='\[\e[01;34m\] \w \$\[\e[00m\] '
}
PROMPT_COMMAND='set_prompt'

You can define variables for the more esoteric escape sequences, at the cost of needing some extra escapes inside the double quotes, to accommodate parameter expansion.

set_prompt () {
    local last_command=$? # Must come first!
    PS1=""
    local blue='\[\e[01;34m\]'
    local white='\[\e[01;37m\]'
    local red='\[\e[01;31m\]'
    local green='\[\e[01;32m\]'
    local reset='\[\e[00m\]'
    local fancyX='\342\234\227'
    local checkmark='\342\234\223'

    PS1+="$white\$? "
    if [[ $last_command == 0 ]]; then
        PS1+="$green$checkmark "
    else
        PS1+="$red$fancyX "
    fi
    if [[ $EUID == 0 ]]; then
        PS1+="$red\\h "
    else
        PS1+="$green\\u@\\h "
    fi
    PS1+="$blue\\w \\\$$reset "
}
like image 88
chepner Avatar answered Oct 02 '22 18:10

chepner