彩色shell脚本输出库

vptzau2j  于 2023-04-07  发布在  Shell
关注(0)|答案(9)|浏览(118)

我正在寻找一个明确的方式来构建shell脚本,生成彩色输出。
不幸的是,我很难找到一个合适的库或好的技术来做到这一点。我发现了很多有用但简单的例子,如this。而且到目前为止,我发现的最全面的指南是this one
在开始编写自己的库之前,我想检查一下是否有人已经编写了它
如果你的解决方案不符合下面的观察,那不是问题。我也想读一读,这样它就可以帮助我,如果决定写我自己的解决方案
我的主要关注/观察:

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

编辑

在对终端控制和输出格式进行了一些研究之后,我正在写这个gist,试图实现这一点。到目前为止,它做得相当不错

ipakzgxi

ipakzgxi1#

下面是我的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...."

brccelvz

brccelvz2#

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

xmakbtuz

xmakbtuz3#

我从Demure的列表中获得灵感,并对其进行了一些修改。(并将\e更改为十六进制\x1B,因为自Snow Leopard以来,OS X的www.example.com不支持前者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_颜色是“明亮”或“高强度”的颜色。这样做,您甚至可以将它们与其他字体样式混合使用。(例如,带下划线的亮白色)
如果你想收藏这篇文章,我为它做了一个要点:https://gist.github.com/ian128K/39a490e5aa8d3bb77a8b

11dmarpk

11dmarpk4#

无耻的插头...检查Rainbow.sh
用途
只需导入rainbow.sh并开始使用脚本中的可用函数。

source rainbow.sh 

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

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

at0kjp5o

at0kjp5o5#

tput可以处理的内容比您链接到的页面上显示的要多。tput所做的就是根据当前终端的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|

你可以像使用gist中定义的变量一样使用它;事实上,您可以使用它以便携方式创建要点:

black=$(tput setaf 0)
k5ifujac

k5ifujac6#

我个人在我的xcol工具中使用这些,我使用AndreasSchamanek代码作为参考开发。

#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工具,了解想法和示例
https://ownyourbits.com/2017/01/23/colorize-your-stdout-with-xcol/

roejwanj

roejwanj7#

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

1wnzp6jl

1wnzp6jl8#

只是一个快速添加到这个使用所有的真棒答案在这个线程,但也增加了对--no-color标志和NO_COLOR环境变量的支持。

## Enable our easy to read Colour Flags as long as --no-colors hasn't been passed or the NO_COLOR Env Variable is set. 
## NOTE: the NO_COLOR env variable is from: https://no-color.org/
if [[ ! $* == *--no-color* && -z "${NO_COLOR}" ]]
then 

    ESeq="\x1b["

    # Set up our Colour Holders. 
    ResetColor="$ESeq"'0m'    # Text Reset

    Bold="$ESeq"'1m';    Underline="$ESeq"'4m'

    # Regular              Bold                        Underline                       High Intensity           
    Black="$ESeq"'0;30m';  BoldBlack="$ESeq"'1;30m';   UnderlineBlack="$ESeq"'4;30m';  IntenseBlack="$ESeq"'0;90m'; 
    Red="$ESeq"'0;31m';    BoldRed="$ESeq"'1;31m';     UnderlineRed="$ESeq"'4;31m';    IntenseRed="$ESeq"'0;91m';   
    Green="$ESeq"'0;32m';  BoldGreen="$ESeq"'1;32m';   UnderlineGreen="$ESeq"'4;32m';  IntenseGreen="$ESeq"'0;92m'; 
    Yellow="$ESeq"'0;33m'; BoldYelllow="$ESeq"'1;33m'; UnderlineYellow="$ESeq"'4;33m'; IntenseYellow="$ESeq"'0;93m';
    Blue="$ESeq"'0;34m';   BoldBlue="$ESeq"'1;34m';    UnderlineBlue="$ESeq"'4;34m';   IntenseBlue="$ESeq"'0;94m';  
    Purple="$ESeq"'0;35m'; BoldPurple="$ESeq"'1;35m';  UnderlinePurple="$ESeq"'4;35m'; IntensePurple="$ESeq"'0;95m';
    Cyan="$ESeq"'0;36m';   BoldCyan="$ESeq"'1;36m';    UnderlineCyan="$ESeq"'4;36m';   IntenseCyan="$ESeq"'0;96m';  
    White="$ESeq"'0;37m';  BoldWhite="$ESeq"'1;37m';   UnderlineWhite="$ESeq"'4;37m';  IntenseWhite="$ESeq"'0;97m'; 

    #Bold High Intensity                Background              High Intensity Backgrounds
    BoldIntenseBlack="$ESeq"'1;90m';    OnBlack="$ESeq"'40m';   OnIntenseBlack="$ESeq"'0;100m';
    BoldIntenseRed="$ESeq"'1;91m';      OnRed="$ESeq"'41m';     OnIntenseRed="$ESeq"'0;101m';
    BoldIntenseGreen="$ESeq"'1;92m';    OnGreen="$ESeq"'42m';  OnIntenseGreen="$ESeq"'0;102m';
    BoldIntenseYellow="$ESeq"'1;93m';   OnYellow="$ESeq"'43m';  OnIntenseYellow="$ESeq"'0;103m';
    BoldIntenseBlue="$ESeq"'1;94m';     OnBlue="$ESeq"'44m';    OnIntenseBlue="$ESeq"'0;104m';
    BoldIntensePurple="$ESeq"'1;95m';   OnPurple="$ESeq"'45m';  OnIntensePurple="$ESeq"'0;105m';
    BoldIntenseCyan="$ESeq"'1;96m';     OnCyan="$ESeq"'46m';    OnIntenseCyan="$ESeq"'0;106m';
    BoldIntenseWhite="$ESeq"'1;97m';    OnWhite="$ESeq"'47m';   OnIntenseWhite="$ESeq"'0;107m';
fi

然后,您可以在echo中使用这些,如下所示:

echo -e "${BoldGreen}Grabbing our variables${ResetColor}"
echo -e "${BoldGreen}Done${ResetColor} ${Red}Moving on ...${ResetColor}"

要禁用输出,您可以export NO_COLOR=true禁用整个会话的颜色,或者将标志添加到单独的脚本调用./myscript.sh --no-color
这个添加是从https://no-color.org/中提示的,并且一些看到颜色代码出现在日志和文件输出中的经验使它们难以阅读。当您期望非控制台介质将涉及时,这些标志包裹在颜色定义周围,可以很容易地从脚本中关闭颜色输出。
我还扩展了颜色名称的可读性,希望你有一个bit of an IDE,以帮助编写脚本;所以长度不如可读性重要。我甚至保留了美国的color😉
我不是一个Bash/shellMaven,所以请让我知道你发现的任何问题;但我希望这能帮助一些人!

lf3rwulv

lf3rwulv9#

你可以使用colors.sh。首先你必须将colors.sh源代码添加到你的脚本中,然后你可以像下面这样使用echo

source colors.sh

# with colors.sh sourced, you can use the constants
echo "${RED}This is red text${NC}"

# or you can use the functions
echo $(gray "[INFO] " && green "This is green test")

有两种方法。第一种是使用函数,第二种是使用常量。您可以选择最适合您的方法。

相关问题