彩色的shell脚本输出库

我正在寻找一个确定的方式来构build生成彩色输出的shell脚本。

不幸的是,我很难find适当的lib或好的技术来做到这一点。 我发现了很多有用但简单的例子。 也是我迄今为止发现的最全面的指南是这一个 。

在我开始写我自己的图书馆之前,我想检查是否有人已经写了它

如果你的解决scheme不符合下面的观察这不是一个问题。 我也想阅读它,所以如果决定写我自己的解决scheme,它可以帮助我

我主要的关注/观察:

  • 需要安全 。 要避免垃圾输出,因为不是所有的terminal或寻呼机/编辑器(如less,more,vim等)都支持彩色输出或更多样式的输出(粗体,眨眼,斜体等)
  • 需要简单易读 。 直接使用ANSI转义码是非常可怕的: echo -e '\033[32mthis is ugly and \033[1;32mvery green\033[0m'
  • 需要给我访问前景和背景文本的整个调色板和样式 。 我发现的大多数例子只使用前景文本的基本颜色。
  • 它最好只使用简单的命令,比如在大多数操作系统上可以find的命令和/或通用命令中构build的bash或更简单的shell。 例如,我可以使用colorize但我需要ruby(这是有点确定)和colorize gem安装(不好)
  • Tput似乎是一个不错的select,因为它可以很好地处理shell游标,但是它更简单/不灵活

编辑

在对terminal控制和输出格式化进行一些研究之后,我写这个试图完成这个任务的要点 。 到目前为止,它做得很好

这里是我的dotfiles修改后的片段,应该做你想做的

 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'; 

那么你可以只是echo -e "${Blu}blue ${Red}red ${RCol}etc...."

echo -e“\ 033 [33; 31m彩色文字” – 红色

echo -e“\ 033 [33; 32m彩色文字” – 绿色

echo -e“\ 033 [33; 33m彩色文字” – 黄色

echo -e“\ 033 [33; 34m彩色文字” – 蓝色

echo -e“\ 033 [33; 35m彩色文字” – 洋红色

echo -e“\ 033 [33; 30m彩色文字” – 灰色

echo -e“\ 033 [33; 36m彩色文字” – 青色

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

我以娴静的名单作为灵感,做了一些干扰。 (并且把它改成了hex\x1B ,因为从Snow Leopard开始,OS X的Terminal.app不支持前者。)下面是我想到的:

 ## Colours and font styles ## Syntax: echo -e "${FOREGROUND_COLOUR}${BACKGROUND_COLOUR}${STYLE}Hello world!${RESET_ALL}" # Escape sequence and resets ESC_SEQ="\x1b[" RESET_ALL="${ESC_SEQ}0m" RESET_BOLD="${ESC_SEQ}21m" RESET_UL="${ESC_SEQ}24m" # Foreground colours FG_BLACK="${ESC_SEQ}30;" FG_RED="${ESC_SEQ}31;" FG_GREEN="${ESC_SEQ}32;" FG_YELLOW="${ESC_SEQ}33;" FG_BLUE="${ESC_SEQ}34;" FG_MAGENTA="${ESC_SEQ}35;" FG_CYAN="${ESC_SEQ}36;" FG_WHITE="${ESC_SEQ}37;" FG_BR_BLACK="${ESC_SEQ}90;" FG_BR_RED="${ESC_SEQ}91;" FG_BR_GREEN="${ESC_SEQ}92;" FG_BR_YELLOW="${ESC_SEQ}93;" FG_BR_BLUE="${ESC_SEQ}94;" FG_BR_MAGENTA="${ESC_SEQ}95;" FG_BR_CYAN="${ESC_SEQ}96;" FG_BR_WHITE="${ESC_SEQ}97;" # Background colours (optional) BG_BLACK="40;" BG_RED="41;" BG_GREEN="42;" BG_YELLOW="43;" BG_BLUE="44;" BG_MAGENTA="45;" BG_CYAN="46;" BG_WHITE="47;" # Font styles FS_REG="0m" FS_BOLD="1m" FS_UL="4m" 

BR_颜色是“明亮”或“高强度”颜色。 这样做,你甚至可以将它们与其他字体样式混合。 (例如,下划线明亮的白色)

如果你想collections这个,我做了一个要点: https : //gist.github.com/ian128K/39a490e5aa8d3bb77a8b

无耻的插件…检查Rainbow.sh

用法

只需导入rainbow.sh并开始使用脚本中的可用函数。

 source rainbow.sh vargreen=$(echogreen "Grass is green") varred=$(echored "Roses are red") echo "$vargreen ..Crickets are noisy.. $varred" 

在这里输入图像说明

tput可以处理超过您链接到的页面上显示的内容。 所有tput都会根据当前terminal的termcap / terminfo数据库中显示的内容,输出包含在echo语句中的字符。 一些例子:

 $ tput setaf 5 | hexdump -C 00000000 1b 5b 33 35 6d |.[35m| $ tput setaf 17 | hexdump -C 00000000 1b 5b 33 38 3b 35 3b 31 37 6d |.[38;5;17m| $ tput reset | hexdump -C 00000000 1b 63 1b 5b 3f 31 30 30 30 6c 1b 5b 3f 32 35 68 |.c.[?1000l.[?25h| 

您可以像使用您的要点中定义的variables一样使用它。 事实上,你可以用便携的方式来创build你的要点:

 black=$(tput setaf 0) 

我个人使用这些我使用Andreas Schamanek代码开发的xcol工具作为参考。

 #normal=$(tput sgr0) # normal text normal=$'\e[0m' # (works better sometimes) bold=$(tput bold) # make colors bold/bright red="$bold$(tput setaf 1)" # bright red text green=$(tput setaf 2) # dim green text fawn=$(tput setaf 3); beige="$fawn" # dark yellow text yellow="$bold$fawn" # bright yellow text darkblue=$(tput setaf 4) # dim blue text blue="$bold$darkblue" # bright blue text purple=$(tput setaf 5); magenta="$purple" # magenta text pink="$bold$purple" # bright magenta text darkcyan=$(tput setaf 6) # dim cyan text cyan="$bold$darkcyan" # bright cyan text gray=$(tput setaf 7) # dim white text darkgray="$bold"$(tput setaf 0) # bold black = dark gray text white="$bold$gray" # bright white text 

我在这样的脚本中使用这些variables

 echo "${red}hello ${yellow}this is ${green}coloured${normal}" 

检查我的xcol工具的想法和例子

https://ownyourbits.com/2017/01/23/colorize-your-stdout-with-xcol/

xcol示例