Mewarnai lingkungan terminal dan shell Anda?

262

Saya menghabiskan sebagian besar waktu saya bekerja di lingkungan Unix dan menggunakan emulator terminal. Saya mencoba menggunakan warna pada baris perintah, karena warna membuat output lebih berguna dan intuitif.

Opsi apa yang ada untuk menambahkan warna ke lingkungan terminal saya? Trik apa yang Anda gunakan? Perangkap apa yang Anda temui?

Sayangnya, dukungan untuk warna bervariasi tergantung pada jenis terminal, OS, pengaturan TERM, utilitas, implementasi buggy, dll.

Berikut adalah beberapa tips dari pengaturan saya, setelah banyak percobaan:

  1. Saya cenderung mengatur TERM=xterm-color, yang didukung pada sebagian besar host (tetapi tidak semua).
  2. Saya bekerja pada sejumlah host yang berbeda, versi OS yang berbeda, dll. Saya menggunakan semuanya dari macOS X, Ubuntu Linux, RHEL / CentOS / Scientific Linux dan FreeBSD. Saya mencoba untuk menjaga hal-hal yang sederhana dan generik, jika memungkinkan.
  3. Saya melakukan banyak pekerjaan menggunakan GNU screen, yang menambahkan lapisan kesenangan lainnya.
  4. Banyak OS mengatur hal-hal seperti dircolorsdan secara default, dan saya tidak ingin memodifikasi ini pada seratus host yang berbeda. Jadi saya mencoba untuk tetap dengan default. Sebagai gantinya, saya mengubah konfigurasi warna terminal saya.
  5. Gunakan warna untuk beberapa perintah Unix ( ls, grep, less, vim) dan cepat Bash . Perintah-perintah ini tampaknya menggunakan standar " ANSI escape sequence ". Sebagai contoh:

    alias less='less --RAW-CONTROL-CHARS'
    export LS_OPTS='--color=auto'
    alias ls='ls ${LS_OPTS}'
    

Saya akan memposting .bashrcdan menjawab pertanyaan saya sendiri Gaya Jeopardy.

Stefan Lasiewski
sumber
fyi pendekatan saya (lihat jawaban di bawah) membahas masalah dengan perbedaan OSX dan Linux, misalnya warna pada satu ls -G dan yang lain ls --color-auto
Michael Durrant
1
Apakah ada yang melihat alat untuk mewarnai kolom? Itu adalah column -t --color?
Tomáš Pospíšek

Jawaban:

121

Berikut adalah beberapa hal yang dapat Anda lakukan:

Editor + Kode
Banyak editor memiliki dukungan penyorotan sintaksis. vimdan emacsaktifkan secara default. Anda juga dapat mengaktifkannya di bawahnano .

Anda juga dapat sintaksis kode sorot pada terminal dengan menggunakan Pygments sebagai alat baris perintah.

grep
grep --color=auto menyoroti semua pertandingan. Anda juga dapat menggunakannya export GREP_OPTIONS='--color=auto'untuk membuatnya tetap tanpa alias. Jika Anda menggunakan --color=always, itu akan menggunakan warna bahkan ketika pemipaan , yang membingungkan hal-hal.

ls

ls --color=always

Warna ditentukan oleh:

export LS_COLORS='rs=0:di=01;34:ln=01;36:mh=00:pi=40;33'

(petunjuk: dircolorsdapat membantu)

PS1
Anda dapat mengatur PS1 (prompt shell) untuk menggunakan warna. Sebagai contoh:

PS1='\e[33;1m\u@\h: \e[31m\W\e[0m\$ '

Akan menghasilkan PS1 seperti:

[yellow] lucas @ ubuntu: [red] ~ [normal] $

Anda bisa menjadi sangat kreatif dengan ini. Sebagai ide:

PS1='\e[s\e[0;0H\e[1;33m\h    \t\n\e[1;32mThis is my computer\e[u[\u@\h:  \w]\$ '

Letakkan bilah di bagian atas terminal Anda dengan beberapa info acak. (Untuk hasil terbaik, gunakan juga alias clear="echo -e '\e[2J\n\n'".)

Menyingkirkan Escape Sequences

Jika ada sesuatu yang macet menghasilkan warna saat Anda tidak menginginkannya, saya menggunakan sedbaris ini untuk menghapus urutan pelarian:

sed "s/\[^[[0-9;]*[a-zA-Z]//gi"

Jika Anda menginginkan pengalaman yang lebih otentik, Anda juga bisa menghilangkan garis yang dimulai \e[8m, yang memerintahkan terminal untuk menyembunyikan teks. (Tidak didukung secara luas.)

sed "s/^\[^[8m.*$//gi"

Perhatikan juga bahwa ^ itu harus aktual, literal ^ [s. Anda dapat mengetiknya dengan menekan ^ V ^ [dalam bash, yaitu Ctrl+ V, Ctrl+ [.

Lucas Jones
sumber
1
Baris PS1 pertama harus membaca seperti ini: PS1='\e[33;1m\u@\h: \e[31m\W\e[0m\$ '. Ada x yang berlebihan setelah backslash keempat.
Chris
3
Pelarian harus dimasukkan dalam \[...\]atau perintah lain di baris kedua akan menimpa baris pertama. PS1 = '[\ e [33; 1m] \ u @ \ h: [\ e [31m] \ W \ e [0m \ $'
yanglifu90
Tidak ls --color=alwaysberhasil. Pendekatan @Michael Durrant lebih baik untuk ini:ls --color=al > /dev/null 2>&1 && alias ls='ls -F --color=al' || alias ls='ls -G'
Simon C.
83

Saya juga menggunakan:

export TERM=xterm-color
export GREP_OPTIONS='--color=auto' GREP_COLOR='1;32'
export CLICOLOR=1
export LSCOLORS=ExFxCxDxBxegedabagacad

Dan jika Anda suka mewarnai prompt Anda, vars warna yang ditentukan dapat berguna:

export COLOR_NC='\e[0m' # No Color
export COLOR_WHITE='\e[1;37m'
export COLOR_BLACK='\e[0;30m'
export COLOR_BLUE='\e[0;34m'
export COLOR_LIGHT_BLUE='\e[1;34m'
export COLOR_GREEN='\e[0;32m'
export COLOR_LIGHT_GREEN='\e[1;32m'
export COLOR_CYAN='\e[0;36m'
export COLOR_LIGHT_CYAN='\e[1;36m'
export COLOR_RED='\e[0;31m'
export COLOR_LIGHT_RED='\e[1;31m'
export COLOR_PURPLE='\e[0;35m'
export COLOR_LIGHT_PURPLE='\e[1;35m'
export COLOR_BROWN='\e[0;33m'
export COLOR_YELLOW='\e[1;33m'
export COLOR_GRAY='\e[0;30m'
export COLOR_LIGHT_GRAY='\e[0;37m'

Dan prompt saya adalah sesuatu seperti ini:

case $TERM in
     xterm*|rxvt*)
         local TITLEBAR='\[\033]0;\u ${NEW_PWD}\007\]'
          ;;
     *)
         local TITLEBAR=""
          ;;
    esac

local UC=$COLOR_WHITE               # user's color
[ $UID -eq "0" ] && UC=$COLOR_RED   # root's color

PS1="$TITLEBAR\n\[${UC}\]\u \[${COLOR_LIGHT_BLUE}\]\${PWD} \[${COLOR_BLACK}\]\$(vcprompt) \n\[${COLOR_LIGHT_GREEN}\]→\[${COLOR_NC}\] "  

$ (vcprompt) memanggil skrip python di my ~ / sbin yang mencetak informasi kontrol versi tentang lintasan saat ini. Ini termasuk dukungan untuk Mercurial, Git, Svn, Cvs, dll. Penulis skrip memiliki sumbernya di sini .

Tangkapan layar Bash prompt

Ini adalah sumber lengkap dari konfigurasi prompt saya:

Keris
sumber
Lihat di sini untuk solusi untuk masalah saluran yang saya dapatkan ketika saya menggunakan PS1 di atas: stackoverflow.com/questions/5087036/…
Xander Dunn
Saya telah memperbarui jawaban untuk mencerminkan tanda kurung untuk warna pada prompt. Terima kasih!
Kris
1
$LSCOLORSdan $CLICOLORuntuk BSD ls. GNU ls (Linux) digunakan $LS_COLORSdengan sintaks yang berbeda. Karena GNU terasa seperti rumah bagi saya, saya gunakan LSCOLORS=exgxfxDacxBaBaCaCaeaEauntuk meniru warna GNU pada BSD.
Adam Katz
grep: warning: GREP_OPTIONS is deprecated; please use an alias or script
Steven Almeroth
1
Anda mungkin perlu sumber .bashrcfile agar modifikasi menjadi efektif. Anda dapat melakukannya dengan perintah berikut. source /path/to/.bashrc
François
18

grepdan lstelah disebutkan, jika Anda ingin lebih banyak warna memeriksa Generic Coloriser , tujuan awal adalah untuk mewarnai logfiles, tapi langsung dari kotak itu juga colorizes ping, traceroute, gcc, make, netstat, diff, last, ldap, dan cvs.

Ini mudah diperpanjang jika Anda tahu regex. Saya telah menambahkan psdan nmapke daftar (jika Anda masuk, grcsaya akan dengan senang hati berbagi file .conf untuk kedua alat tersebut)

(Btw, untuk menginstalnya melalui synaptic, pacmandan sama-sama Anda mungkin memiliki lebih beruntung mencari "grc")

Sygo
sumber
grcsekarang mendukung pssecara default. Saya akan tertarik dengan nmappewarnaan Anda . Lihat juga jawaban saya untuk meniadakan semua ini dengan cara yang akan menyerap perintah baru ketika Anda meningkatkan grc.
Adam Katz
Aku tahu itu. inilah conf.nmap saya (dan yang lainnya, sungguh) gist.github.com/sygo/844982#file-conf-nmap - Saya perhatikan Anda bekerja di infosec, Anda mungkin menemukan conf.hexdump menarik, saya belum menyelesaikannya meskipun.
Sygo
Terima kasih @Sygo. Saya telah bercabang dan merevisi inti Anda. Saya tidak pernah benar-benar melakukan data dengan git (apalagi github's gists) dan saya tidak tahu cara mengusulkan penggabungan kembali kepada Anda (saya menduga ini karena gist terlalu disederhanakan).
Adam Katz
Saya menduga Anda tidak bisa karena itu intisari dan bukan repositori yang tepat. Saya sudah memeriksa garpu Anda dan saya jelas-jelas memberikan versi Anda. Saya ingin tahu apa yang akan menjadi hex dump satu ...
Sygo
11

Saya telah mengasah .bashrc saya selama bertahun-tahun untuk bekerja pada OSX dan Ubuntu.
Saya juga mengurangi ukurannya menjadi 28 baris dengan pernyataan kondisi ringkas.
Dengan itu, prompt PS1 saya terlihat seperti: masukkan deskripsi gambar di sini

dengan waktu berwarna merah, nama pengguna berwarna hijau, nama mesin dengan warna biru muda, pwd dengan warna biru gelap dan cabang git dengan warna kuning.

Fitur prompt PS1 saya:

  • menunjukkan cabang git!
  • jalur direktori yang panjang (lebih dari 6 elemen) 'dipangkas' untuk menampilkan direktori top 3 dan bottom 3 dengan _antara saat itu (itulah pwd sedbagian dari LOCATION).
  • carriage kembali di akhir sehingga prompt selalu di sebelah kiri!

Baris yang relevan dari .bashrcfile saya adalah:

git_branch () { git branch 2> /dev/null | sed -e '/^[^*]/d' -e 's/* \(.*\)/\1/'; }
HOST='\033[02;36m\]\h'; HOST=' '$HOST
TIME='\033[01;31m\]\t \033[01;32m\]'
LOCATION=' \033[01;34m\]`pwd | sed "s#\(/[^/]\{1,\}/[^/]\{1,\}/[^/]\{1,\}/\).*\(/[^/]\{1,\}/[^/]\{1,\}\)/\{0,1\}#\1_\2#g"`'
BRANCH=' \033[00;33m\]$(git_branch)\[\033[00m\]\n\$ '
PS1=$TIME$USER$HOST$LOCATION$BRANCH
PS2='\[\033[01;36m\]>'

Untuk ls dengan warna saat tersedia dan tidak ada kesalahan saat tidak (yaitu OSX):

ls --color=al > /dev/null 2>&1 && alias ls='ls -F --color=al' || alias ls='ls -G'
Michael Durrant
sumber
1
Warna tersedia untuk lsOS X, tetapi dilakukan dengan menggunakan export CLICOLOR=1.
ThomasW
3
@ Thomas tapi tidak di linux :-p Pria itu menggunakan keduanya.
Jimmy Kane
1
Meskipun demikian, ThomasW benar untuk menunjukkan bahwa jawabannya salah dalam mengatakan bahwa warna tidak tersedia lspada MacOS 10. Jawabannya juga salah karena string prompt di sini sebenarnya salah. Mereka tidak menyeimbangkan dengan benar \[dan\] , dan telah menyebabkan masalah bagi setidaknya satu orang menyalin jawaban ini .
JdeBP
9

Warna untuk halaman manual ( lebih detail ):

function _colorman() {
  env \
    LESS_TERMCAP_mb=$(printf "\e[1;35m") \
    LESS_TERMCAP_md=$(printf "\e[1;34m") \
    LESS_TERMCAP_me=$(printf "\e[0m") \
    LESS_TERMCAP_se=$(printf "\e[0m") \
    LESS_TERMCAP_so=$(printf "\e[7;40m") \
    LESS_TERMCAP_ue=$(printf "\e[0m") \
    LESS_TERMCAP_us=$(printf "\e[1;33m") \
      "$@"
}
function man() { _colorman man "$@"; }
function perldoc() { command perldoc -n less "$@" |man -l -; }

Warna untuk grep ( 1;32berwarna hijau cerah, lihat tulisan lain di sini untuk warna lain):

GREP_OPTS='--color=auto'      # for aliases since $GREP_OPTIONS is deprecated
GREP_COLOR='1;32'             # (legacy) bright green rather than default red
GREP_COLORS="ms=$GREP_COLOR"  # (new) Matching text in Selected line = green
alias   grep='grep $GREP_OPTS'
alias egrep='egrep $GREP_OPTS'
alias fgrep='fgrep $GREP_OPTS'

Lebih banyak warna untuk GNU ls :

# use the config at ~/.dircolors if it exists, otherwise generate anew
eval "$( dircolors --sh $(ls -d ~/.dircolors 2>/dev/null) )"

# Usage: _ls_colors_add BASE NEW [NEW...]
# Have LS color given NEW extensions the way BASE extension is colored
_ls_colors_add() {
  local BASE_COLOR="${LS_COLORS##*:?.$1=}" NEW
  if [ "$LS_COLORS" != "$BASE_COLOR" ]; then
    BASE_COLOR="${BASE_COLOR%%:*}"
    shift
    for NEW in "$@"; do
      if [ "$LS_COLORS" = "${LS_COLORS#*.$NEW=}" ]; then
        LS_COLORS="${LS_COLORS%%:}:*.$NEW=$BASE_COLOR:"
      fi
    done
  fi
  export LS_COLORS
}

_ls_colors_add zip jar xpi            # archives
_ls_colors_add jpg ico JPG PNG webp   # images
_ls_colors_add ogg opus               # audio (opus now included by default)

CLICOLOR=1   # BSD auto-color trigger (like  ls -G  but for everything)
if ls -ld --color=auto / >/dev/null 2>&1
  then alias ls="ls -ph --color=auto"
  else alias ls="ls -ph"
fi

Instal grc( Generic Colouriser ) dan tambahkan ke alias Anda:

# using this as a variable allows easier calling down lower
export GRC='grc -es --colour=auto'

# loop through known commands plus all those with named conf files
for cmd in g++ head ld ping6 tail traceroute6 `locate grc/conf.`; do
  cmd="${cmd##*grc/conf.}"  # we want just the command
  # if the command exists, alias it to pass through grc
  type "$cmd" >/dev/null 2>&1 && alias "$cmd"="$GRC $cmd"
done

# This needs run-time detection. We even fake the 'command not found' error.
configure() {
  if [[ -x ./configure ]]; then
    colourify ./configure "$@"
  else
    echo "configure: command not found" >&2
    return 127
  fi
}

# GRC plus LS awesomeness (assumes you have an alias for ls)
unalias ll 2>/dev/null
if ls -ld --color=always / >/dev/null 2>&1; then GNU_LS="--color=always"; fi

ll() {
  if [[ -t 1 ]] || [[ -n "$CLICOLOR_FORCE" ]]
    then colourify ls -l $GNU_LS "$@"
    else ls -l "$@"
  fi
}

Warna untuk diff : Terlalu banyak konten untuk suatu fungsi, gunakan skrip dan alias dalam file rc Anda (tidak perlu jika Anda menginstal grc):

#!/usr/bin/perl
use strict;
use warnings;

open (DIFF, "-|", "diff", @ARGV) or die $!;

my $ydiff = 1;
while (<DIFF>) {
  if (not -t 1) {
    print;
    next;
  }
  chomp;
  $ydiff = 0 if /^[ <>\@+-]/ or ($. == 1 && /^\d+[a-z]{1,5}\d+$/);
  my $color = "";
  if (! $ydiff && /^[\@+-<>]/) {
    $color = (/^[<-](?!--$)/ ? 1 : /^[+>]/ ? 2 : 5);
  } elsif ($ydiff && /\t {6}([<|>])(?:\t|$)/) {
    $color = ($1 eq "<" ? 1 : $1 eq ">" ? 2 : 4);
  }
  $color ? printf ("\e[1;3%dm%s\e[0;0m\n",$color,$_) : print "$_\n";
}
close DIFF;

Warna untuk bash prompt :

# Shorten home dir, cygwin drives, paths that are too long
if [ -d /cygdrive ] && uname -a |grep -qi cygwin; then CYGWIN_OS=1; fi
function PSWD() {
  local p="$*" space A B cols="${COLUMNS:-`tput cols 2>/dev/null || echo 80`}"
  p="${p/$HOME/\~}"         # shrink home down to a tilde
  if [ -n "$CYGWIN_OS" ] && [ "${p#/cygdrive/?/}" != "$p" ]; then
    p="${p:10:1}:${p:11}"   # /cygdrive/c/hi -> c:/hi
  fi
  space="$((${#USER}+${#HOSTNAME}+6))"  # width w/out the path
  if [ "$cols" -lt 60 ]; then echo -n "$N "; space=-29; p="$p$N\b"; fi
  if [ "$cols" -lt "$((space+${#p}+20))" ]; then # < 20 chars for the command
    A=$(( (cols-20-space)/4 ))      # a quarter of the space (-20 for cmd)
    if [ $A -lt 4 ]; then A=4; fi   # 4+ chars from beginning
    B=$(( cols-20-space-A*2 ))      # half (plus rounding) of the space
    if [ $B -lt 8 ]; then B=8; fi   # 8+ chars from end
    p="${p:0:$A}..${p: -$B}"
  fi
  echo "$p"
}

PSC() { echo -ne "\[\033[${1:-0;38}m\]"; }
PR="0;32"       # default color used in prompt is green
if [ "$(id -u)" = 0 ]; then
    sudo=41     # root is red background
  elif [ "$USER" != "${SUDO_USER:-$USER}" ]; then
    sudo=31     # not root, not self: red text
  else sudo="$PR"   # standard user color
fi
PROMPT_COMMAND='[ $? = 0 ] && PS1=${PS1[1]} || PS1=${PS1[2]}'
PSbase="$(PSC $sudo)\u$(PSC $PR)@\h $(PSC 33)\$(PSWD \w)"
PS1[1]="$PSbase$(PSC $PR)\$ $(PSC)"
PS1[2]="$PSbase$(PSC  31)\$ $(PSC)"
PS1="${PS1[1]}"
unset sudo PR PSbase

demo bash prompt

Adam Katz
sumber
1
Mengunggah untuk tangkapan layar
Hijau
PSWD()Fungsi saya dulunya kompatibel dengan POSIX tetapi jauh lebih mudah difasilitasi menggunakan penanganan substring bash / zsh. Lihat revisi 6 untuk versi POSIX, yang melibatkan banyak tanda tanya dan sama sekali tidak dapat disesuaikan dengan lebar terminal. Saya tidak memperbarui tangkapan layar, tetapi hanya sedikit perubahan pada lebar 80 karakter.
Adam Katz
CLICOLOR=1tidak bekerja untuk saya dengan FREEBSD 11.2
Simon C.
1
@SimonC. - Anda mungkin menggunakan utilitas GNU pada sistem FreeBSD Anda daripada yang BSD. CLICOLOR=1 lsharus melakukan hal yang sama dengan ls -Gmenggunakan BSD ( ls -gpada BSD yang lebih lama). Jika ls --colorberfungsi (tidak ada kesalahan), Anda menggunakan lsperintah GNU dan $CLICOLORdiabaikan.
Adam Katz
1
@SimonC. - Anda harus benar-benar memuat ~/.bashrcagar perubahan apa pun berlaku. Baik menjalankan source ~/.bashrcatau memulai sesi bash baru (meluncurkan terminal atau menjalankan bash).
Adam Katz
8

Atur prompt tebal / berwarna. Dari cyberciti.biz dan BashFAQ

# 'tput bold' will work regardless of the foreground and background colors.
# Place the tput output into variables, so they are only execd once.
bold=$(tput bold) # This could also be a color.
reset=$(tput sgr0)
export PS1="\u@\[$bold\]\h\[$reset\]:\w \$ "

Saya juga berhasil menemukan pengaturan warna yang didukung secara luas, dan yang tidak mencetak karakter gobbledygook di lingkungan yang lebih lama (bahkan FreeBSD4!), Dan tampaknya berfungsi dengan baik jika TERM = vt100, xterm, xterm-color. (Sebagian besar). Dari .bashrc saya:

# Set some options, based on the OS
OS=`uname -s` 

case "$OS" in
    "SunOS" ) 
        # Solaris ls doesn't allow color, so use special characters
        LS_OPTS='-F'
        alias  ls='ls ${LS_OPTS}'
        ;;
    "Linux" )
        # GNU ls supports colors!
        # See dircolors to customize colors
        export LS_OPTS='--color=auto' 
        alias  ls='ls ${LS_OPTS}'

        # Get color support for 'less'
        export LESS="--RAW-CONTROL-CHARS"

        # Use colors for less, man, etc.
        [[ -f ~/.LESS_TERMCAP ]] && . ~/.LESS_TERMCAP

        export GREP_OPTIONS="--color=auto"

        ;;
    "Darwin"|"FreeBSD")

        # Most FreeBSD & Apple Darwin supports colors
        export CLICOLOR=true
        # Get color support for 'less'
        export LESS="--RAW-CONTROL-CHARS"

        # Use colors for less, man, etc.
        [[ -f ~/.LESS_TERMCAP ]] && . ~/.LESS_TERMCAP

        export GREP_OPTIONS="--color=auto"
        ;;
    * ) 
        echo "Unknown OS [$OS]"
        ;;
esac
Stefan Lasiewski
sumber
1
Atau jika Anda ingin menggunakan ZSH, pesan Phil Gold di aperiodic.net/phil/prompt adalah sebuah karya seni.
tsvallender
5

Hal-hal yang belum dikatakan di sini:

Untuk mewarnai keluaran kompilasi Anda dengan gcc, ada colorgcc oleh Johannes Schlüter

Untuk mewarnai log, ada multitail

Untuk mewarnai stdout, saya mengumpulkan xcol

contoh xcol

Saya pribadi menggunakan ini dari alat xcol.

#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

Saya menggunakan variabel-variabel ini dalam skrip saya seperti itu

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

Saya juga suka fungsi kecil ini berwarnaEcho (ditemukan di Stack Overflow)

function coloredEcho(){
    local exp=$1;
    local color=$2;
    if ! [[ $color =~ '^[0-9]$' ]] ; then
       case $(echo $color | tr '[:upper:]' '[:lower:]') in
        black) color=0 ;;
        red) color=1 ;;
        green) color=2 ;;
        yellow) color=3 ;;
        blue) color=4 ;;
        magenta) color=5 ;;
        cyan) color=6 ;;
        white|*) color=7 ;; # white or invalid color
       esac
    fi
    tput setaf $color;
    echo $exp;
    tput sgr0;
}

coloredEcho "This text is green" green

Maaf, tidak diizinkan memposting lebih banyak tautan

nachoparker
sumber
2
Halo, bagaimana Anda membuat bendera, untuk jalur cepat? Saya menyebutkan batang persegi panjang dengan ujung segitiga Terima kasih
Artur Vieira
apakah itu berfungsi di terminal gnu ubuntu juga?
helle
lnav juga merupakan alat yang hebat untuk menunjukkan file log berwarna
Cyril Chaboisseau
4

Saya sarankan Anda memeriksa ZSH dan pluginnya oh-my-zsh yang memiliki salah satu fitur konsol paling kuat yang saya lihat. Salah satunya adalah memilih tema untuk terminal Anda. Ini adalah contoh dari tema saya ... Dalam tty warna tidak begitu hangat tetapi mereka sama seperti di gambar ini ... Bagaimanapun cara Anda akan menyukainya!

masukkan deskripsi gambar di sini


sumber
2
Jika saya bisa, saya akan memilih ini untuk saran Oh-My-ZSH. Sebagai seorang insinyur sistem yang bekerja secara luas di Terminal, dan sebagai seseorang yang mencoba mengadopsi zsh / oh-my-zsh ke dalam alur kerja saya, saya dapat dengan jujur ​​mengatakan saya tidak akan merekomendasikan ZSH kepada siapa pun. Tentu, Anda dapat symlink zsh ke file yang dinamai shell lain dan meniru shell itu, tetapi ketika Anda melakukannya, itu tidak membaca .bashrc, .bash_profile Anda, dll. Selain itu, Anda tidak dapat memasukkan emulate bash.zprofile atau .zshrc Anda file. Bagi siapa saja yang bekerja dengan fitur-fitur canggih di BASH, ada banyak kehalusan yang akan menggigit Anda. BASH lebih baik.
Charles Addis
2
Satu-satunya hal yang ZSH miliki di luar kotak yang lebih baik daripada BASH adalah penyelesaian perintah, tetapi bahkan itu dapat diprogram dalam BASH. Mungkin seseorang yang tidak menggunakan shell kecuali untuk tugas-tugas duniawi sesekali harus mengadopsi ZSH, tetapi itu bukan untuk siapa pun yang perlu menggunakan shell secara luas. yang =~operator dapat menggigit Anda, cara zsh menangani array dapat menggigit Anda, dll Setelah menggunakan zsh / Oh-My-zsh selama sekitar 9 bulan saya punya cukup itu. Saya menggunakan tema khusus yang saya tulis sendiri, saya porting ke BASH dan menulis prompt git saya sendiri dan saya tidak pernah melihat ke belakang. Sekarang saya tidak lagi khawatir tentang portabilitas
Charles Addis
1
"Ini memiliki salah satu fitur konsol paling kuat yang saya lihat. Salah satunya adalah memilih tema untuk terminal Anda."
Jonathan Hartley
@ JonathanHartley, komentar Anda sepertinya tidak lengkap. ?
Wildcard
2
Terima kasih atas perhatian Anda tetapi komentar saya mengatakan semua yang ingin saya katakan.
Jonathan Hartley
4

Untuk melihat keluaran warna yang berbeda, gunakan colordiff .

sudo apt-get install colordiff

Pipa segala keluaran format-berbeda ke colordiff:

output dari diff disalurkan ke colordiff

Ini termasuk beberapa format alternatif diff, seperti -y(berdampingan).

Atau, jika dipanggil sendiri (tanpa ada yang disalurkan ke dalamnya) maka ia bertindak sebagai pembungkus di sekitar 'diff', dan warna output. Oleh karena itu saya punya ini di .bashrc saya, alias 'diff' ke colordiff.

# if colordiff is installed, use it
if type colordiff &>/dev/null ; then
    alias diff=colordiff
Jonathan Hartley
sumber
1
The .bashrccontoh hilang final fi, dan dapat dikonversi ke satu perintah-line:type colordiff &> /dev/null && alias diff='colordiff'
Teemu Leisti
3

Beberapa dekorasi teks (tebal) untuk dengan mudah membedakan antara shell root dan non-root. Untuk zsh:

if test $UID = 0
    then PS1="%B${PS1}%b "
fi

Untuk Bash:

if test $UID = 0
    then PS1="\033[1m${PS1}\033[0m"
fi
Mischa Arefiev
sumber
Silakan tentukan shell Anda. Satu-satunya tag khusus shell pertanyaan adalah bash , tapi saya rasa kode Anda tidak bash.
manatwork
@manatwork: maaf, lupa menyebutkan bahwa itu Zsh. Memperbarui pos saya.
Mischa Arefiev
3

Saya hanya ingin tahu hal yang sama. Saya punya pendekatan sendiri, tetapi saya mencari alternatif.

Saya menulis bungkus bash di sekitar panggilan program dan menyalurkan output mereka sekalipun sed. Apa yang saya sukai sedadalah bahwa itu akan memodifikasi dan mengulang setiap baris segera => tidak banyak buffering. Namun, saya tidak suka bahwa untuk setiap panggilan ke program yang dibungkus sedkode diuraikan dan dikompilasi.

Sebagai contoh, inilah yang saya lakukan untuk mewarnai keluaran ip:

#
# Colorcodes
#
NORMAL=`echo -e '\033[0m'`
RED=`echo -e '\033[31m'`
GREEN=`echo -e '\033[0;32m'`
LGREEN=`echo -e '\033[1;32m'`
BLUE=`echo -e '\033[0;34m'`
LBLUE=`echo -e '\033[1;34m'`
YELLOW=`echo -e '\033[0;33m'`


#
# command: ip
# highlight ip addresses, default route and interface names
#

IP4=$GREEN
IP6=$LBLUE
IFACE=${YELLOW}
DEFAULT_ROUTE=$LBLUE

IP_CMD=$(which ip)

function colored_ip()
{
${IP_CMD} $@ | sed \
    -e "s/inet [^ ]\+ /${IP4}&${NORMAL}/g"\
    -e "s/inet6 [^ ]\+ /${IP6}&${NORMAL}/g"\
    -e "s/^default via .*$/${DEFAULT_ROUTE}&${NORMAL}/"\
    -e "s/^\([0-9]\+: \+\)\([^ \t]\+\)/\1${IFACE}\2${NORMAL}/"
}

alias ip='colored_ip'
Bananguin
sumber
3

Untuk mengatur prompt, saya punya ini di file .bashrc saya.

#Set variables for foreground colors
fgRed=$(tput setaf 1)     ; fgGreen=$(tput setaf 2)  ; fgBlue=$(tput setaf 4)
fgMagenta=$(tput setaf 5) ; fgYellow=$(tput setaf 3) ; fgCyan=$(tput setaf 6)
fgWhite=$(tput setaf 7)   ; fgBlack=$(tput setaf 0)
#Set variables for background colors
bgRed=$(tput setab 1)     ; bgGreen=$(tput setab 2)  ; bgBlue=$(tput setab 4)
bgMagenta=$(tput setab 5) ; bgYellow=$(tput setab 3) ; bgCyan=$(tput setab 6)
bgWhite=$(tput setab 7)   ; bgBlack=$(tput setab 0)
#Set variables for font weight and text decoration
B=$(tput bold) ; U=$(tput smul) ; C=$(tput sgr0)
#NOTE: ${C} clears the current formatting

if [[ $USER = "root" ]]; then
  PS1="${B}${fgRed}\u${C}@\h(\s): ${fgGreen}\w${C} > "
else
  PS1="${B}${fgCyan}\u${C}@\h(\s): ${fgGreen}\w${C} > "
fi

Ini memberi saya prompt yang terlihat seperti ini:

user@host(bash): ~/bin >

Direktori yang berfungsi berwarna hijau. Dan nama pengguna tebal dan cyan kecuali saya menjalankan shell sudo, dalam hal ini nama pengguna ("root") menampilkan huruf tebal dan merah.

Saya pribadi sangat suka memiliki karakter kontrol pemformatan disimpan dalam variabel karena membuat membaca kode untuk mengatur prompt lebih mudah. Itu juga membuat pengeditan prompt lebih mudah.

Alasan saya menggunakan tputadalah bahwa itu seharusnya lebih didukung secara universal daripada 033[01;31m\]urutan aneh . Juga, sebagai bonus tambahan, jika Anda melakukannya echo $PS1di prompt, Anda akan melihat prompt mentah dengan warna alih-alih urutan kontrol yang tidak dapat dipahami.

Sildoreth
sumber
2

Anda dapat mencoba proyek yang membantu mewarnai keluaran skrip juga, yang dinamai ScriptEchoColor di source forge: http://scriptechocolor.sourceforge.net/

ex.:

echoc "@{lr}text output in light red"
echoc "@{bLGu}text outpus in blue, light green background and underlined"
echoc "you @{lr} can @{bLGu} mix @{-a} it all too"
echoc -x "ls" #executes ls command and colorizes it automatically to be easy to be seen

Warna otomatis dapat dikonfigurasi.

Ini adalah contoh yang dilakukan dengan itu: masukkan deskripsi gambar di sini

Aquarius Power
sumber
2

Alat Python serba guna untuk mewarnai keluaran perintah adalah ' colout '

Anda memberinya regex dengan grup N, diikuti dengan daftar N warna yang dipisahkan koma. Teks apa pun yang cocok dengan grup akan ditampilkan dalam warna yang sesuai.

Jadi misalnya, jika Anda melihat beberapa hasil tes:

python -m unittest discover -v

Output tidak murni dari beberapa Python unittests

maka Anda dapat merapikannya dengan:

python -m unittest discover -v 2>&1 | colout '(.*ERROR$)|(.*FAIL$)|(\(.*\))' red,yellow,black bold

Output berwarna dari beberapa Python unittests

Lihat bagaimana regex saya memiliki tiga grup (tanda kurung) diikuti oleh tiga warna (dan opsional tiga gaya, tapi saya telah menggunakan steno untuk mengatur semua warna menjadi 'tebal', jadi grup 'hitam', yang mencocokkan teks dalam tanda kurung , keluar sebagai abu-abu gelap.)

Perhatikan juga bagaimana saya harus menambahkan 2>&1ke akhir permintaan Python, karena output dari unittest ada di stderr, jadi saya memindahkannya ke stdout sehingga saya bisa menyalurkannya ke colout.

Ini umumnya sangat mudah digunakan sehingga saya sering menemukan diri saya membuat doa colout baru dengan cepat, dan menggunakan kembali atau memodifikasi mereka dari sejarah baris perintah saya.

Satu-satunya downside dari itu adalah bahwa ia datang sebagai paket Python, bukan dieksekusi mandiri, jadi Anda perlu menginstalnya menggunakan pip, atau sudo python setup.py install.

Jonathan Hartley
sumber
1

Saya menggunakan pembungkus warna .

cw adalah pembungkus warna ANSI real-time non-intrusif untuk perintah berbasis unix umum pada GNU / linux. cw dirancang untuk mensimulasikan lingkungan dari perintah yang dieksekusi, sehingga jika seseorang mengetikkan 'du', 'df', 'ping', dll. di shell mereka, ia akan secara otomatis mewarnai output secara real-time sesuai dengan definisi. file yang berisi format warna yang diinginkan. cw memiliki dukungan untuk pewarnaan kecocokan wildcard, pewarnaan tokenized, header / footer, pewarnaan skenario kasus, pewarnaan definisi garis bergantung perintah, dan termasuk lebih dari 50 file definisi yang dibuat sebelumnya.

Hampir mulus, tetapi begitu saya menemukan bahwa ps dalam shell interaktif mengembalikan output yang berbeda membandingkan ps dalam pipa.

pengguna3132194
sumber
0

Untuk Mac Anda dapat menggunakan yang berikut seperti yang ditentukan di sini

if [ "$TERM" = xterm ]; then TERM=xterm-256color; fi
doesnt_matter
sumber
0

jika Anda ingin membuat vimwarna - warni Anda seperti saya, saya sarankan Anda untuk mengikuti dua langkah:

  1. pelajari cara mengaktifkan fitur dengan mengikuti tautan ini: aktifkan penyorotan sintaks warna dalam vi atau vim .

langkah-langkah kunci dalam tautan:

  1. Edit file ~ / .vimrc dengan mengetik perintah: vi ~ / .vimrc

  2. Tambahkan opsi berikut: sintaks aktif

  3. Simpan dan tutup file

  4. Uji dengan menjalankan perintah vim : vim foo.sh

  1. temukan skema warna yang Anda suka, dan gunakan. Skema yang saya gunakan: skema yang saya gunakan
ZhaoGang
sumber
Saat menggunakan tautan ke sumber eksternal, Anda harus memeriksa bagian "Berikan konteks untuk tautan" (Mengutip bagian penting) dari bagian yang relevan dari panduan ini: unix.stackexchange.com/help/how-to-answer
Gert van den Berg
0

Jika bash adalah pilihan Anda, saya sarankan oh-my-bash . Jika zsh adalah pilihan Anda, saya sarankan oh-my-zsh . Keduanya mendukung pewarnaan terminal Anda dan keluaran yang berbeda.

TimWirtjes
sumber
0

Saya ingin rendah hati beriklan publikasi baru-baru ini dari taatau textattr , perpustakaan dan alat baris perintah yang bertujuan untuk membuat menambahkan warna dan atribut untuk mempercantik terminal output dari program Anda lebih mudah dengan menerjemahkan spesifikasi terbaca-manusia ke dalam kode melarikan diri ANSI.

Sebagai contoh:

echo "The Git repo $(ta yellow)${CUR_REPO}$(ta off) is $(ta green)up-to-date$(ta off)"

atau bahkan lebih pendek:

echo "The Git repo $(ta y)${CUR_REPO}$(ta f) is $(ta g)up-to-date$(ta f)"

atau alternatif:

tawrite "The Git repo " @y ${CUR_REPO} @f " is " @g up-to-date @f "\n"

akan memberi Anda sesuatu seperti:

masukkan deskripsi gambar di sini

Saat ini perpustakaan ini dapat digunakan dari empat bahasa C, C ++, D dan Python selain dari penggunaan commandline dari shell favorit Anda.

Perhatikan bahwa itu tidak secara otomatis mewarnai output dari program lain. Ini lebih kegunaan untuk membantu Anda dengan tidak harus mengingat kode muskil. Anda hanya perlu menggunakan nama warna yang jelas atau singkatan rgb cmyk w (hite) (dari) f mereka yang mudah diingat .

Untuk lebih jelasnya kunjungi repo textattr .

jamadagni
sumber