More fun with the bash prompt
A few years ago, I posted some fun Bash prompt tools, part of which was adding emoticons to the prompt based on the previous command's exit code. I figured it was time to revisit that bit of fun with a couple of enhancements.
First, a bit of code cleanup so color choices are more obvious, and add faces for SIGILL and SIGKILL.
#!/bin/bash
# source this
function prompt_smile () {
    local retval=$?
    local red=196
    local yellow=226
    local green=46
    local darkgreen=28
    if [ $retval -eq 0 ]; then
        color=$green
        face=":)"
    elif [ $retval -eq 1 ]; then
        color=$red
        face=":("
    elif [ $retval -eq 130 ]; then # INT
        color=$yellow
        face=":|"
    elif [ $retval -eq 132 ]; then # ILL
        color=$darkgreen
        face=":-&"
    elif [ $retval -eq 137 ]; then # KILL
        color=$red
        face="X_X"
    elif [ $retval -eq 139 ]; then # SEGV
        color=$red
        face=">_<"
    elif [ $retval -eq 143 ]; then # TERM
        color=$red
        face="x_x"
    else
        color=$red
        face="O_o"
    fi
    echo -e "\001$(tput setaf $color; tput bold)\002$face\001$(tput sgr0)\002"
    return $retval # preserve the value of $?
}
PS1="$PS1\$(prompt_smile) "
When sourced into your shell with . promptsmile.sh, you get results like this:
bash-4.4$ . promptsmile.sh bash-4.4$ :) false bash-4.4$ :( true bash-4.4$ :) sleep 60 & X=$!; (sleep 1; kill -INT $X) & fg %1 [1] 26699 [2] 26700 sleep 60 [2]+ Done ( sleep 1; kill -INT $X ) bash-4.4$ :| sleep 60 & X=$!; (sleep 1; kill -ILL $X) & fg %1 [1] 26709 [2] 26710 sleep 60 Illegal instruction (core dumped) [2] Done ( sleep 1; kill -ILL $X ) bash-4.4$ :-& sleep 60 & X=$!; (sleep 1; kill -KILL $X) & fg %1 [1] 26776 [2] 26777 sleep 60 Killed [2]+ Done ( sleep 1; kill -KILL $X ) bash-4.4$ X_X sleep 60 & X=$!; (sleep 1; kill -SEGV $X) & fg %1 [1] 26788 [2] 26789 sleep 60 Segmentation fault (core dumped) [2] Done ( sleep 1; kill -SEGV $X ) bash-4.4$ >_< sleep 60 & X=$!; (sleep 1; kill -TERM $X) & fg %1 [1] 26852 [2] 26853 sleep 60 Terminated [2]+ Done ( sleep 1; kill -TERM $X ) bash-4.4$ x_x (exit 4) bash-4.4$ O_o true bash-4.4$ :) exit
One bit of feedback I received was that the use of :) vs x_x meant that command prompts would shift by a character, and it would be better to have all the emoticons be of the same width. So if you prefer your faces all the same width, promptsmile-3wide.sh gives you more consistent line lengths:
#!/bin/bash
# source this
function prompt_smile () {
    local retval=$?
    local red=196
    local yellow=226
    local green=46
    local darkgreen=28
    if [ $retval -eq 0 ]; then
        color=$green
        face=":-)"
    elif [ $retval -eq 1 ]; then
        color=$red
        face=":-("
    elif [ $retval -eq 130 ]; then # INT
        color=$yellow
        face=":-|"
    elif [ $retval -eq 132 ]; then # ILL
        color=$darkgreen
        face=":-&"
    elif [ $retval -eq 137 ]; then # KILL
        color=$red
        face="X_X"
    elif [ $retval -eq 139 ]; then # SEGV
        color=$red
        face=">_<"
    elif [ $retval -eq 143 ]; then # TERM
        color=$red
        face="x_x"
    else
        color=$red
        face="O_o"
    fi
    echo -e "\001$(tput setaf $color; tput bold)\002$face\001$(tput sgr0)\002"
    return $retval # preserve the value of $?
}
PS1="$PS1\$(prompt_smile) "
Which looks like this:
bash-4.4$ . promptsmile-3wide.sh bash-4.4$ :-) false bash-4.4$ :-( true bash-4.4$ :-) sleep 60 & X=$!; (sleep 1; kill -INT $X) & fg %1 [1] 26914 [2] 26915 sleep 60 [2]+ Done ( sleep 1; kill -INT $X ) bash-4.4$ :-| sleep 60 & X=$!; (sleep 1; kill -ILL $X) & fg %1 [1] 26925 [2] 26926 sleep 60 Illegal instruction (core dumped) [2] Done ( sleep 1; kill -ILL $X ) bash-4.4$ :-& sleep 60 & X=$!; (sleep 1; kill -KILL $X) & fg %1 [1] 26991 [2] 26992 sleep 60 Killed [2]+ Done ( sleep 1; kill -KILL $X ) bash-4.4$ X_X sleep 60 & X=$!; (sleep 1; kill -SEGV $X) & fg %1 [1] 27001 [2] 27002 sleep 60 Segmentation fault (core dumped) [2] Done ( sleep 1; kill -SEGV $X ) bash-4.4$ >_< sleep 60 & X=$!; (sleep 1; kill -TERM $X) & fg %1 [1] 27065 [2] 27066 sleep 60 Terminated [2]+ Done ( sleep 1; kill -TERM $X ) bash-4.4$ x_x (exit 4) bash-4.4$ O_o true bash-4.4$ :-) exit
For that old-school style, the text-based emoticons work well, but systems that support emojis are becoming rather common-place, so we can use UTF-8 to get little emotional faces in our prompts:
#!/bin/bash
# source this
function prompt_emoji () {
    local retval=$?
    local red=196
    local yellow=226
    local green=46
    local darkgreen=28
    if [ $retval -eq 0 ]; then
        color=$yellow
        face=$'\360\237\230\200' # :D
    elif [ $retval -eq 1 ]; then
        color=$yellow
        face=$'\360\237\230\246' # :(
    elif [ $retval -eq 130 ]; then # INT
        color=$yellow
        face=$'\360\237\230\220' # :|
    elif [ $retval -eq 132 ]; then # ILL
        color=$darkgreen
        #face=$'\360\237\244\242' # nauseated # get a rectangle in Konsole
        face=$'\360\237\230\223' # cold sweat face
    elif [ $retval -eq 137 ]; then # KILL
        color=$yellow
        face=$'\360\237\230\265' # x_x
    elif [ $retval -eq 139 ]; then # SEGV
        #color=$yellow
        #face=$'\360\237\244\250' # Face with one eyebrow raised # get a rectangle in Konsole
        color=$red
        face=$'\360\237\230\240' # Angry face
    elif [ $retval -eq 143 ]; then # TERM
        color=$yellow
        face=$'\360\237\230\243' # >_<
    else
        color=$yellow
        face=$'\360\237\230\245' # ;(
    fi
    echo -e "\001$(tput setaf $color; tput bold)\002$face\001$(tput sgr0)\002"
    return $retval # preserve the value of $?
}
PS1="$PS1\$(prompt_emoji) "
Which will give something maybe like this. The way the faces are rendered will depend on your terminal. For Konsole, these are simple line art; for Gnome-terminal some match Konsole, others have a more blob-like shape; and here they're rendered by your browser.
bash-4.4$ . promptemoji.sh bash-4.4$ 😀 false bash-4.4$ 😦 true bash-4.4$ 😀 sleep 60 & X=$!; (sleep 1; kill -INT $X) & fg %1 [1] 27143 [2] 27144 sleep 60 [2]+ Done ( sleep 1; kill -INT $X ) bash-4.4$ 😐 sleep 60 & X=$!; (sleep 1; kill -ILL $X) & fg %1 [1] 27154 [2] 27155 sleep 60 Illegal instruction (core dumped) [2] Done ( sleep 1; kill -ILL $X ) bash-4.4$ 😓 sleep 60 & X=$!; (sleep 1; kill -KILL $X) & fg %1 [1] 27220 [2] 27221 sleep 60 Killed [2]+ Done ( sleep 1; kill -KILL $X ) bash-4.4$ 😵 sleep 60 & X=$!; (sleep 1; kill -SEGV $X) & fg %1 [1] 27232 [2] 27233 sleep 60 Segmentation fault (core dumped) [2] Done ( sleep 1; kill -SEGV $X ) bash-4.4$ 😠 sleep 60 & X=$!; (sleep 1; kill -TERM $X) & fg %1 [1] 27295 [2] 27296 sleep 60 Terminated [2]+ Done ( sleep 1; kill -TERM $X ) bash-4.4$ 😣 (exit 4) bash-4.4$ 😥 true bash-4.4$ 😀 exit
Beyond that, you'll find that your terminal may render a different subset of emojis than what mine does. I found a useful site for finding emojis with octal UTF-8 which makes it easy to update promptemoji.sh with something that suits your particular set of software.
And for ANSI colors, you may find this reference handy.
Go then, and liven up your own bash prompts, even more!
Attachments (3)
- 
    promptemoji.sh
       (1.3 KB) -
      added by retracile 6 years ago.
                promptemoji.sh 
- 
    promptsmile-3wide.sh
       (912 bytes) -
      added by retracile 6 years ago.
                promptsmile-3wide.sh 
- 
    promptsmile.sh
       (909 bytes) -
      added by retracile 6 years ago.
                promptsmile.sh 
Download all attachments as: .zip

 
 rss
 rss
          
Comments
No comments.