Nomi di colori terminali "amichevoli" negli script di shell?


25

Sono a conoscenza di librerie in lingue come Ruby e Javascript per semplificare la colorazione degli script del terminale utilizzando nomi di colore come "rosso".

Ma c'è qualcosa del genere per gli script di shell in Bash, o Ksh, o altro?


8
si prega di contrassegnare una risposta come corretta ... fino ad ora hai segnato solo 1 delle 46 domande totali!
m13r,

Risposte:


39

Puoi definire i colori nei tuoi script bash in questo modo:

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'

E poi usali per stampare nei colori richiesti:

printf "%s\n" "Text in ${red}red${end}, white and ${blu}blue${end}."

11

Puoi usare tput ORprintf

Utilizzando tput,

basta creare la funzione come di seguito e usarli

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)
}

puoi chiamare la funzione sopra usando shw_err "WARNING:: Error bla bla"

utilizzando printf

print red; echo -e "\e[31mfoo\e[m"

2
echo -enon lo è printf, e ha anche bisogno di un avvertimento che differisce tputdall'opzione in quanto non si adatta automaticamente per adattarsi $TERM.
Toby Speight,


4

Per semplici usi comuni (riga completa di testo in un solo colore, con newline finale) ho modificato il codice di jasonwryan come segue:

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

O in Awk, leggermente modificato: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 il

3

Meglio usare tputche gestirà i caratteri di escape a seconda delle capacità di output / terminale. (Se un terminale non può interpretare\e[* i codici colore, sarà "inquinato" che renderà più difficile la lettura dell'output. (O a volte, se greptale output, vedrai quelli \e[*nei risultati)

Guarda questo tutorial pertput .

Tu puoi scrivere :

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

Ecco un tutorial per stampare un orologio colorato nel terminale.

Inoltre, tieni presente che tputpuò comunque stampare il carattere di escape quando reindirizza STDOUT su un file:

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

Per evitare che ciò accada, imposta le tue tputvariabili come proposto in questa soluzione .

Utilizzando il nostro sito, riconosci di aver letto e compreso le nostre Informativa sui cookie e Informativa sulla privacy.
Licensed under cc by-sa 3.0 with attribution required.