Memipakan perintah melalui filter warna


13

Apakah ada yang seperti ini di Unix?

$ echo "this should show in red" | red
$ echo "this should show in green" | green
$ echo "this should show in blue" | blue

Di sini saya tidak bermaksud untuk teks kode warna literal untuk muncul (untuk disisipkan dalam file, misalnya). Maksud saya teks tersebut benar-benar muncul di terminal sebagai warna itu. Apakah ini mungkin?

Jawaban:


14

Berikut ini adalah skrip kecil yang melakukan hal itu. Simpan ini sebagai colordalam direktori di Anda $PATH(misalnya, ~/binjika ada di Anda $PATH):

#!/usr/bin/env perl

use strict;
use warnings;
use Term::ANSIColor; 

my $color=shift;
while (<>) {
    print color("$color").$_.color("reset");
} 

Kemudian, sampaikan teks Anda melalui skrip, memberi .sebagai pola untuk mencocokkan dan menentukan warna:

tangkapan layar terminal yang menjalankan skrip

Warna yang didukung tergantung pada kemampuan terminal Anda. Untuk lebih jelasnya, lihat dokumentasi dari Term::ANSIColorpaket.


Apakah ada daftar warna yang valid untuk lewat di suatu tempat?
George

@ George itu tergantung pada pengaturan Anda. Jika Anda memiliki terminal berkemampuan RGB, Anda bahkan dapat menggunakan hal-hal seperti rgb001, rgb123dll. Lihat perldoc.perl.org/Term/ANSIColor.html#Supported-Colors untuk detail lebih lanjut.
terdon

23

Anda akan menggunakannya tputuntuk itu:

tput setaf 1
echo This is red
tput sgr0
echo This is back to normal

Ini dapat digunakan untuk membangun pipa:

red() { tput setaf 1; cat; tput sgr0; }
echo This is red | red

Warna dasar masing-masing hitam (0), merah (1), hijau, kuning, biru, magenta, cyan dan putih (7). Anda akan menemukan semua detail di halaman terminfo(5)manual .


6

Dengan zsh:

autoload colors; colors
for color (${(k)fg})
  eval "$color() {print -n \$fg[$color]; cat; print -n \$reset_color}"

Lalu:

$ echo "while" | blue
while

1

(seperti yang dibahas dalam komentar, gunakantput sebaliknya jika Anda memilikinya)

Menggunakan bourne shell dan echo(built-in) perintah yang memahami opsi ANSI melarikan diri \edengan -e:

black()  { IFS= ; while read -r line; do echo -e '\e[30m'$line'\e[0m'; done; }
red()    { IFS= ; while read -r line; do echo -e '\e[31m'$line'\e[0m'; done; }
green()  { IFS= ; while read -r line; do echo -e '\e[32m'$line'\e[0m'; done; }
yellow() { IFS= ; while read -r line; do echo -e '\e[33m'$line'\e[0m'; done; }
blue()   { IFS= ; while read -r line; do echo -e '\e[34m'$line'\e[0m'; done; }
purple() { IFS= ; while read -r line; do echo -e '\e[35m'$line'\e[0m'; done; }
cyan()   { IFS= ; while read -r line; do echo -e '\e[36m'$line'\e[0m'; done; }
white()  { IFS= ; while read -r line; do echo -e '\e[37m'$line'\e[0m'; done; }

echo '    foo\n    bar' | red

atau, skrip shell yang lebih umum (katakanlah, /usr/local/bin/colorize):

#!/bin/sh

usage() {
    echo 'usage:' >&2
    echo '  some-command | colorize {black, red, green, yellow, blue, purple, cyan, white}' >&2
    exit 1
}

[ -z "$1" ] && usage

case $1 in
    black)  color='\e[30m' ;;
    red)    color='\e[31m' ;;
    green)  color='\e[32m' ;;
    yellow) color='\e[33m' ;;
    blue)   color='\e[34m' ;;
    purple) color='\e[35m' ;;
    cyan)   color='\e[36m' ;;
    white)  color='\e[36m' ;;
    *) usage ;;
esac

IFS=
while read -r line; do
    echo -e $color$line'\e[0m'
done

IFS=diperlukan untuk mencegah pemotongan spasi putih (lihat POSIX untuk detailnya).

cara kerja IFS


Saya menyarankan untuk lebih suka menggunakan tput.
LinuxSecurityFreak

Ini benar-benar solusi non-portabel. Maksud saya Anda harus mematuhi POSIX.
LinuxSecurityFreak

1
Tentu, jika kita bisa. Ini dimaksudkan untuk digunakan pada sistem tertanam atau lingkungan penyelamatan seperti busybox. Saya memutuskan untuk menulis jawaban ini karena saya percaya cuplikan kode ini berguna dalam beberapa situasi - setidaknya untuk pengguna busybox dan bagi saya, yang harus menampilkan warna hanya dengan perintah bawaan shell pada lingkungan yang disematkan hari ini.
wataash

lupa mengatakan bahwa busybox biasa tidak memiliki tput.
wataash
Dengan menggunakan situs kami, Anda mengakui telah membaca dan memahami Kebijakan Cookie dan Kebijakan Privasi kami.
Licensed under cc by-sa 3.0 with attribution required.