Nama warna terminal "ramah" dalam skrip shell?

25

Saya mengetahui perpustakaan dalam bahasa seperti Ruby dan Javascript untuk mempermudah pewarnaan skrip terminal Anda dengan menggunakan nama warna seperti "merah".

Tetapi apakah ada sesuatu seperti ini untuk skrip shell di Bash, atau Ksh, atau apa pun?

kaca
sumber
8
tandai jawaban sebagai benar ... Anda hanya menandai 1 dari total 46 pertanyaan yang diajukan sejauh ini!
m13r

Jawaban:

39

Anda dapat menentukan warna dalam skrip bash Anda seperti:

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'

Dan kemudian menggunakannya untuk mencetak dalam warna yang Anda inginkan:

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

Anda bisa menggunakan tput ATAUprintf

Menggunakan tput,

cukup buat fungsi seperti di bawah ini dan gunakan

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

Anda dapat memanggil fungsi di atas menggunakan shw_err "WARNING:: Error bla bla"

Menggunakan printf

print red; echo -e "\e[31mfoo\e[m"
Rahul Patil
sumber
2
echo -etidak printf, dan juga perlu peringatan yang berbeda dari tputopsi karena tidak secara otomatis beradaptasi $TERM.
Toby Speight
7

Dalam zsh :

autoload -U colors
colors

echo $fg[green]YES$fg[default] or $fg[red]NO$fg[default]?
Gilles 'SANGAT berhenti menjadi jahat'
sumber
Juga:print -P '%F{red}blah%f'
Stéphane Chazelas
4

Untuk penggunaan umum yang sederhana (baris teks penuh hanya dalam satu warna, dengan mengikuti baris baru) Saya memodifikasi kode jasonwryan sebagai berikut:

#!/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"
Wildcard
sumber
Atau dalam bahasa Awk, sedikit dimodifikasi: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

Lebih baik menggunakan tputyang akan menangani karakter melarikan diri tergantung pada kemampuan output / terminal. (Jika terminal tidak dapat mengartikan \e[*kode warna, maka itu akan menjadi "tercemar" yang membuat output lebih sulit untuk dibaca. (Atau kadang-kadang, jika Anda grepoutput seperti itu, Anda akan melihatnya \e[*di hasil)

Lihat tutorialtput ini untuk .

Kamu bisa menulis :

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

Berikut ini adalah tutorial untuk mencetak Jam berwarna di terminal.

Juga, perhatikan bahwa tputmungkin masih mencetak karakter escape ketika mengarahkan kembali STDOUT ke file:

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

Untuk mencegah hal ini terjadi, atur tputvariabel Anda seperti yang diusulkan dalam solusi ini .

el-teedee
sumber