Bir komutu renk filtresi aracılığıyla pipetleme


13

Unix'te böyle bir şey var mı?

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

Burada değişmez renk kodu metninin (örneğin bir dosyaya yapıştırılacağı) gelmesini istemiyorum. Sadece metnin aslında terminalde bu renk olarak görünmesini kastediyorum. Mümkün mü?

Yanıtlar:


14

İşte bunu yapan küçük bir senaryo. Olarak kaydet colorsenin bir dizinde $PATH(örneğin, ~/binsenin de eğer yıllardan $PATH):

#!/usr/bin/env perl

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

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

Ardından, metninizi komut dosyası içinden geçirerek .eşleşecek desen olarak verin ve bir renk belirtin:

komut dosyasını çalıştıran bir terminalin ekran görüntüsü

Desteklenen renkler terminalinizin yeteneklerine bağlıdır. Daha fazla ayrıntı için paketin belgelerine bakın Term::ANSIColor.


Bir yere geçmek için geçerli olan renklerin bir listesi var mı?
George

@Kurulumunuza bağlı olan george. RGB özellikli bir terminaliniz varsa rgb001, rgb123vb. Şeyleri bile kullanabilirsiniz . Daha fazla bilgi için perldoc.perl.org/Term/ANSIColor.html#Supported-Colors adresine bakın.
terdon

23

Bunun tputiçin kullanırsınız:

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

Bu bir boru inşa etmek için kullanılabilir:

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

Temel renkler sırasıyla siyah (0), kırmızı (1), yeşil, sarı, mavi, macenta, mavi ve beyazdır (7). Sen tüm ayrıntıları bulacaksınız terminfo(5)manpage .


6

İle zsh:

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

Ve sonra:

$ echo "while" | blue
while

1

(yorumlarda tartışıldığı gibi, bunun yerine varsa kullanıntput )

Bourne kabuğu ve kullanma echoANSI kaçış anlar (built-in) komutu \eile -eseçeneği:

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

veya daha genel bir kabuk komut dosyası (diyelim ki /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=boşluk kırpmayı önlemek için gereklidir ( ayrıntılar için POSIX'e bakın).

IFS nasıl çalışır?


Kullanmayı tercih ederim tput.
LinuxSecurityFreak

Bu tamamen taşınabilir olmayan bir çözümdür. Demek istediğim POSIX'e uymalısın.
LinuxSecurityFreak

1
Tabii, eğer yapabilirsek. Gömülü sistemler veya meşgul kutusu gibi kurtarma ortamlarında kullanılmak üzere tasarlanmıştır. Bu yanıtı yazmaya karar verdim, çünkü bu kod snippet'lerinin bazı durumlarda yararlı olduğuna inanıyorum - en azından meşgul kutusu kullanıcıları ve benim için, bugün yalnızca gömülü bir ortamda kabuğun yerleşik komutları ile renkler çıkarmak zorunda kaldı.
wataash

sıradan bir meşgul kutusunun tput olmadığını söylemeyi unuttum.
wataash
Sitemizi kullandığınızda şunları okuyup anladığınızı kabul etmiş olursunuz: Çerez Politikası ve Gizlilik Politikası.
Licensed under cc by-sa 3.0 with attribution required.