Logo Questions Linux Laravel Mysql Ubuntu Git Menu
 

Colored shell script output library

I am looking for a definitive way to build shell scripts that generates colored output.

Unfortunately I am having a hard time finding an appropriate lib or good technique for doing this. I found a lot of helpful but simple examples like this. Also the most comprehensive guide that I found until now is this one.

Before I start writing my own library, I want to check if anyone already wrote it

If your solution does not fit into the observations below thats not a problem. I would like also to read it so it can help me out if decide to write my own solution

My main concerns/observations:

  • Needs to be safe. Want to avoid garbage output as not all terminals or pagers/editors (like less, more, vim, and so on) support colored output or more styled output (bold, blinked, italic, etc)
  • Needs to be easy and readable. Using ANSI escape codes directly is horrible: echo -e '\033[32mthis is ugly and \033[1;32mvery green\033[0m'
  • Needs to give me access to the whole color palette and styles for foreground and background text. Most of the examples I found uses only the basic colors for foreground text only.
  • Its preferable to use only simple commands like bash or simpler shells built in commands and/or common commands that can be found on most operating systems. For instance I can use colorize but I would need ruby (that's somewhat ok) and the colorize gem installed (not ok)
  • Tput seems to be a good option as it can manipulate the shell cursor quite well, but it is somewhat simpler/less flexible

Edit

After some research on terminal control and output formatting, I am writing this gist that tries to accomplish this. So far it is doing quite well

like image 820
Bruno Penteado Avatar asked May 30 '13 18:05

Bruno Penteado


People also ask

How do you change the color of a shell script?

A script can use escape sequences to produce colored text on the terminal. Colors for text are represented by color codes, including, reset = 0, black = 30, red = 31, green = 32, yellow = 33, blue = 34, magenta = 35, cyan = 36, and white = 37.

How do I print a color output in terminal?

import os # System call os. system("") # Class of different styles class style(): BLACK = '\033[30m' RED = '\033[31m' GREEN = '\033[32m' YELLOW = '\033[33m' BLUE = '\033[34m' MAGENTA = '\033[35m' CYAN = '\033[36m' WHITE = '\033[37m' UNDERLINE = '\033[4m' RESET = '\033[0m' print(style.

What does $() mean in shell script?

$() – the command substitution. ${} – the parameter substitution/variable expansion.


2 Answers

Here is an modified snippet from my dotfiles that should do what you want

RCol='\e[0m'    # Text Reset

# Regular           Bold                Underline           High Intensity      BoldHigh Intens     Background          High Intensity Backgrounds
Bla='\e[0;30m';     BBla='\e[1;30m';    UBla='\e[4;30m';    IBla='\e[0;90m';    BIBla='\e[1;90m';   On_Bla='\e[40m';    On_IBla='\e[0;100m';
Red='\e[0;31m';     BRed='\e[1;31m';    URed='\e[4;31m';    IRed='\e[0;91m';    BIRed='\e[1;91m';   On_Red='\e[41m';    On_IRed='\e[0;101m';
Gre='\e[0;32m';     BGre='\e[1;32m';    UGre='\e[4;32m';    IGre='\e[0;92m';    BIGre='\e[1;92m';   On_Gre='\e[42m';    On_IGre='\e[0;102m';
Yel='\e[0;33m';     BYel='\e[1;33m';    UYel='\e[4;33m';    IYel='\e[0;93m';    BIYel='\e[1;93m';   On_Yel='\e[43m';    On_IYel='\e[0;103m';
Blu='\e[0;34m';     BBlu='\e[1;34m';    UBlu='\e[4;34m';    IBlu='\e[0;94m';    BIBlu='\e[1;94m';   On_Blu='\e[44m';    On_IBlu='\e[0;104m';
Pur='\e[0;35m';     BPur='\e[1;35m';    UPur='\e[4;35m';    IPur='\e[0;95m';    BIPur='\e[1;95m';   On_Pur='\e[45m';    On_IPur='\e[0;105m';
Cya='\e[0;36m';     BCya='\e[1;36m';    UCya='\e[4;36m';    ICya='\e[0;96m';    BICya='\e[1;96m';   On_Cya='\e[46m';    On_ICya='\e[0;106m';
Whi='\e[0;37m';     BWhi='\e[1;37m';    UWhi='\e[4;37m';    IWhi='\e[0;97m';    BIWhi='\e[1;97m';   On_Whi='\e[47m';    On_IWhi='\e[0;107m';

Then you can just echo -e "${Blu}blue ${Red}red ${RCol}etc...."

like image 173
demure Avatar answered Sep 27 '22 18:09

demure


echo -e "\033[33;31m Color Text" - red
echo -e "\033[33;32m Color Text" - green
echo -e "\033[33;33m Color Text" - yellow
echo -e "\033[33;34m Color Text" - blue
echo -e "\033[33;35m Color Text" - Magenta
echo -e "\033[33;30m Color Text" - Gray
echo -e "\033[33;36m Color Text" - Cyan

http://techietent.blogspot.in/2013/03/how-to-echo-colored-text-in-linux-shell.html

like image 34
Ranjithkumar T Avatar answered Sep 27 '22 18:09

Ranjithkumar T