„Przyjazne” nazwy kolorów terminali w skryptach powłoki?

25

Zdaję sobie sprawę z bibliotek w językach takich jak Ruby i JavaScript, które ułatwiają kolorowanie skryptów terminali przy użyciu nazw kolorów takich jak „czerwony”.

Ale czy jest coś takiego dla skryptów powłoki w Bash, Ksh, czy cokolwiek innego?

lustro
źródło
8
proszę zaznaczyć poprawną odpowiedź ... zaznaczyłeś tylko 1 z 46 dotychczas zadanych pytań!
m13r

Odpowiedzi:

39

Możesz zdefiniować kolory w swoich skryptach bash w następujący sposób:

red=$'\e[1;31m'
grn=$'\e[1;32m'
yel=$'\e[1;33m'
blu=$'\e[1;34m'
mag=$'\e[1;35m'
cyn=$'\e[1;36m'
end=$'\e[0m'

A następnie użyj ich do wydrukowania w wymaganych kolorach:

printf "%s\n" "Text in ${red}red${end}, white and ${blu}blue${end}."
jasonwryan
źródło
11

Możesz użyć tput ORprintf

Za pomocą tput,

po prostu utwórz funkcję jak poniżej i użyj ich

shw_grey () {
    echo $(tput bold)$(tput setaf 0) $@ $(tput sgr 0)
}

shw_norm () {
    echo $(tput bold)$(tput setaf 9) $@ $(tput sgr 0)
}

shw_info () {
    echo $(tput bold)$(tput setaf 4) $@ $(tput sgr 0)
}

shw_warn () {
    echo $(tput bold)$(tput setaf 2) $@ $(tput sgr 0)
}
shw_err ()  {
    echo $(tput bold)$(tput setaf 1) $@ $(tput sgr 0)
}

możesz wywołać powyższą funkcję za pomocą shw_err "WARNING:: Error bla bla"

Za pomocą printf

print red; echo -e "\e[31mfoo\e[m"
Rahul Patil
źródło
2
echo -enie jest printf, a także potrzebuje ostrzeżenia, że ​​różni się od tputopcji tym, że nie dostosowuje się automatycznie do koloru $TERM.
Toby Speight,
7

W Zsh :

autoload -U colors
colors

echo $fg[green]YES$fg[default] or $fg[red]NO$fg[default]?
Gilles „SO- przestań być zły”
źródło
Również:print -P '%F{red}blah%f'
Stéphane Chazelas
4

Do prostych typowych zastosowań (pełny wiersz tekstu tylko w jednym kolorze, z końcowym znakiem nowej linii) zmodyfikowałem kod jasonwryan w następujący sposób:

#!/bin/bash

red='\e[1;31m%s\e[0m\n'
green='\e[1;32m%s\e[0m\n'
yellow='\e[1;33m%s\e[0m\n'
blue='\e[1;34m%s\e[0m\n'
magenta='\e[1;35m%s\e[0m\n'
cyan='\e[1;36m%s\e[0m\n'

printf "$green"   "This is a test in green"
printf "$red"     "This is a test in red"
printf "$yellow"  "This is a test in yellow"
printf "$blue"    "This is a test in blue"
printf "$magenta" "This is a test in magenta"
printf "$cyan"    "This is a test in cyan"
Dzika karta
źródło
Lub w Awk, nieznacznie zmodyfikowany:awk -v red="$(printf '\e[1;31m%%s\e[0m\\n')" -v green="$(printf '\e[1;32m%%s\e[0m\\n')" 'BEGIN { printf red, "This text is in red"; printf green, "This text is in green" }'
Wildcard
3

Lepiej jest użyć, tputktóry będzie obsługiwał znaki specjalne w zależności od możliwości wyjścia / terminala. (Jeśli terminal nie może zinterpretować \e[*kodów kolorów, zostanie „zanieczyszczony”, co utrudni odczytanie danych wyjściowych. (Lub czasami, jeśli greptakie dane wyjściowe, zobaczysz je \e[*w wynikach)

Zobacz ten samouczek dlatput .

Możesz pisać :

blue=$( tput setaf 4 ) ;
normal=$( tput sgr0 ) ;
echo "hello ${blue}blue world${normal}" ;

Oto samouczek drukowania kolorowego zegara w terminalu.

Zauważ również, że tputnadal może wypisywać znak zmiany znaczenia podczas przekierowywania STDOUT do pliku:

$ myColoredScript.sh > output.log ;
# Problem: output.log will contain things like "^[(B^[[m"

Aby temu zapobiec, skonfiguruj tputzmienne zgodnie z proponowanym rozwiązaniem .

el-teedee
źródło