Colored shell script output library

Szukam definitywnego sposobu budowania skryptów powłoki, które generują kolorowe wyjście.

Niestety mam problem ze znalezieniem odpowiedniej lib lub dobrej techniki do tego. Znalazłem wiele pomocnych, ale prostych przykładów, takich jak to . Najbardziej obszernym przewodnikiem, jaki do tej pory znalazłem, jest Ten .

Zanim zacznę pisać własną bibliotekę, chcę sprawdzić, czy ktoś już ją napisał

Jeśli Twoje rozwiązanie nie pasuje do obserwacje poniżej to nie problem. Chciałbym również go przeczytać, aby mógł mi pomóc, jeśli zdecydujesz się napisać własne rozwiązanie

Moje główne obawy/obserwacje:

  • musi być bezpieczny. Nie wszystkie terminale lub pagery / edytory (takie jak less, more, vim itd.) obsługują kolorowe wyjście lub bardziej stylowe wyjście (pogrubienie, mrugnięcie, kursywa itp.) {]}
  • musi być łatwy i czytelny. Korzystanie z ANSI escape codes bezpośrednio jest straszne: echo -e '\033[32mthis is ugly and \033[1;32mvery green\033[0m'
  • musi dać mi dostęp do całej palety kolorów i stylów dla tekstu pierwszoplanowego i tła. Większość przykładów, które znalazłem, używa tylko podstawowych kolorów dla tekstu pierwszoplanowego.
  • preferowane jest używanie tylko prostych poleceń, takich jak bash lub prostsze powłoki wbudowane w polecenia i / lub popularne polecenia, które można znaleźć w większości systemów operacyjnych. Na przykład mogę użyć colorize , ale potrzebowałbym ruby (to trochę ok) i colorize gem installed (not ok)
  • Tput wydaje się być dobrą opcją, ponieważ może dość dobrze manipulować kursorem powłoki, ale jest nieco prostszy/mniej elastyczny

Edit

Po kilku badaniach nad kontrolą terminala i formatowaniem wyjścia, piszę ten gist , który próbuje to osiągnąć. Jak na razie idzie całkiem dobrze

Author: Community, 2013-05-30

6 answers

Oto zmodyfikowany fragment z mojego dotfiles który powinien robić to, co chcesz

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

Wtedy możesz po prostu echo -e "${Blu}blue ${Red}red ${RCol}etc...."

 81
Author: demure,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2016-02-14 03:17:55

Echo-e "\033 [33; 31m kolor tekstu " - czerwony

Echo-e "\033 [33; 32m kolor tekstu " - zielony

Echo-e "\033 [33; 33m kolor tekstu " - żółty

Echo-e "\033 [33; 34m kolor tekstu " - niebieski

Echo-e "\033[33;35m kolor tekstu " - Magenta

Echo-e "\033[33;30m tekst kolorowy " - Szary

Echo-e "\033 [33; 36m Color Text " - Cyan

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

 13
Author: Ranjithkumar T,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2013-10-17 06:39:27

Wziąłem listę demure ' a jako inspirację i trochę z niej Wyschłem. (I zmieniono \e na szesnastkowe \x1B, ponieważ ten pierwszy nie jest obsługiwany w Terminalu OS X.aplikacja od Snow Leopard.) Oto co wymyśliłem:

## 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"

Kolory BR_ to kolory "jasne" lub "o wysokiej intensywności". W ten sposób można nawet mieszać je z innymi stylami czcionek. (np. podkreślony jasny biały)

Jeśli chcesz to dodać do zakładek, zrobiłem dla niego streszczenie: https://gist.github.com/ian128K/39a490e5aa8d3bb77a8b

 8
Author: Ian128K,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2014-07-28 08:55:26

tput może obsłużyć więcej niż jest to wskazane na stronie, do której odsyłasz. Wszystko tput wyświetla znaki, które umieścisz w instrukcji echo, na podstawie tego, co pojawia się w bieżącej bazie danych terminala termcap/terminfo. Niektóre przykłady:

$ 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|

Użyjesz go w ten sam sposób, w jaki używasz zmiennej zdefiniowanej w Twoim gist; w rzeczywistości możesz użyć jej do stworzenia twojego gist, w przenośny sposób:

black=$(tput setaf 0)
 5
Author: chepner,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2014-03-26 20:44:29

Bezwstydna wtyczka... sprawdź Rainbow.sh

Użycie

Wystarczy zaimportować rainbow.sh i zacznij korzystać z dostępnych funkcji w swoich skryptach.

source rainbow.sh 

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

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

Tutaj wpisz opis obrazka

 4
Author: MGP,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2013-12-19 20:53:52

Osobiście używam ich w moim narzędziu xcol, które opracowałem używając kodu Andreasa Schamanka jako odniesienia.

#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

Używam tych zmiennych w moich skryptach TAK

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

Checkout my xcol tool for ideas and examples

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

przykład xcol

 2
Author: nachoparker,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2017-01-24 08:29:19