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.