Linux 彩色shell脚本输出库

Linux 彩色shell脚本输出库,linux,macos,shell,colors,Linux,Macos,Shell,Colors,我正在寻找一种确定的方法来构建生成彩色输出的shell脚本 不幸的是,我很难找到一个合适的库或好的技术来实现这一点。我发现了很多有用但简单的例子,比如。到目前为止,我找到的最全面的指南是 在我开始编写自己的库之前,我想检查是否有人已经编写了它 如果你的解决方案不符合下面的观察结果,那不是问题。我也想阅读它,这样它可以帮助我,如果决定写我自己的解决方案 我的主要关切/意见: 需要安全。希望避免垃圾输出,因为并非所有终端或寻呼机/编辑器(如less、more、vim等)都支持彩色输出或更具样式的输

我正在寻找一种确定的方法来构建生成彩色输出的shell脚本

不幸的是,我很难找到一个合适的库或好的技术来实现这一点。我发现了很多有用但简单的例子,比如。到目前为止,我找到的最全面的指南是

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

如果你的解决方案不符合下面的观察结果,那不是问题。我也想阅读它,这样它可以帮助我,如果决定写我自己的解决方案

我的主要关切/意见:

  • 需要安全。希望避免垃圾输出,因为并非所有终端或寻呼机/编辑器(如less、more、vim等)都支持彩色输出或更具样式的输出(粗体、闪烁、斜体等)

  • 需要简单易读。直接使用是可怕的:
    echo-e'\033[32m这很难看而且\033[1;32m非常绿\033[0m'
  • 需要允许我访问前景和背景文本的整个调色板和样式。我发现的大多数示例仅使用前景文本的基本颜色
  • 最好只使用简单的命令如bash或更简单的shell内置命令和/或大多数操作系统上可以找到的常用命令。例如,我可以使用,但我需要ruby(这有点好)和安装的colorize gem(不好)
  • 似乎是一个不错的选择,因为它可以很好地操作shell光标,但它有些简单/不太灵活
编辑
在对终端控制和输出格式进行了一些研究之后,我正在写一篇文章来尝试实现这一点。到目前为止,它做得相当好

这里是我的一个修改过的代码片段,它应该可以满足您的需要

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}等等”
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彩色文本”-青色

无耻插头…检查

用法

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

source rainbow.sh 

vargreen=$(echogreen "Grass is green")
varred=$(echored "Roses are red")

echo "$vargreen ..Crickets are noisy.. $varred"

tput
可以处理链接到的页面上显示的内容以外的内容。
tput
所做的一切就是根据当前终端的termcap/TermFo数据库中显示的内容,输出将包含在
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|
您可以像使用gist中定义的变量一样使用它;事实上,您可以使用它以可移植的方式创建gist:

black=$(tput setaf 0)

我以demure的列表为灵感,对其进行了一些整理(并将
\e
更改为十六进制
\x1B
,因为自雪豹之后,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
颜色是“明亮”或“高强度”颜色。通过这种方式,您甚至可以将它们与其他字体样式混合使用。(例如,带下划线的亮白色)


如果您想将其添加到书签中,我做了一个要点:

我个人在我的xcol工具中使用了这些,我使用Andreas Schamanek代码作为参考开发了该工具

#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
我在脚本中像这样使用这些变量

echo "${red}hello ${yellow}this is ${green}coloured${normal}"
查看我的xcol工具以获取想法和示例


为了防止有人来这里寻找对输出着色的shell过滤器,Alexey Gladkov的一个POSIX shell实现潜伏在
utils/cgrep
中(它以一种非常防御的方式设计)以及他更为复杂的用golang编写的代码中。

echo-e'\033[32m这很难看而且\033[1;32mvery green\033[0m'
并不可怕,当你使用像
RED=\033[32m
这样的变量,甚至是一个颜色数组。的确。我想写一个更高级的lib,但可能会坚持在stringsThanks demure中格式化变量。我正在写一个基于你答案的要点(在我的帖子中添加了链接)我可能会在Mac上借用你的样式变量和$TC sub变量,使用
\x1B
而不是
\e
@MaRco85 echoing
'\e[0m'
将重置颜色。您也可以启动一个新的终端。如果您使用
\033
而不是
\e
,您不必担心系统支持问题。@Hugh Perkins许可证将由麻省理工学院颁发,我将在今天晚些时候更新repo。