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
Shameless plug... check Rainbow.sh
Usage
Just import rainbow.sh and start using the available functions in your scripts.
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
Here is an modified snippet from my dotfiles that should do what you want
Then you can just
echo -e "${Blu}blue ${Red}red ${RCol}etc...."
I took demure's list as inspiration and did a little DRYing out of it. (And changed
\e
to the hexadecimal\x1B
, since the former isn't supported in OS X's Terminal.app since Snow Leopard.) Here's what I came up with:The
BR_
colours are the "bright" or "high-intensity" colours. Done this way, you can even mix them with other font styles. (e.g. underlined bright white)If you want to bookmark this, I made a gist for it: https://gist.github.com/ian128K/39a490e5aa8d3bb77a8b
I personally use these in my xcol tool that I developed using Andreas Schamanek code as a reference.
I use these variables in my scripts like so
Checkout my xcol tool for ideas and examples
https://ownyourbits.com/2017/01/23/colorize-your-stdout-with-xcol/
tput
can handle more than is indicated on the page you link to. Alltput
does is output the characters you would include in yourecho
statement, based on what appears in the current terminal's termcap/terminfo database. Some examples:You would use it the same way you use the variable defined in your gist; in fact, you could use it to create your gist, in a portable fashion: