Canalizando um comando através de um filtro de cores


13

Existe algo assim no Unix?

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

Aqui, não quero que o texto literal do código de cores seja exibido (para ser colado em um arquivo, por exemplo). Quero apenas que o texto apareça no terminal com essa cor. Isso é possível?

Respostas:


14

Aqui está um pequeno script que faz exatamente isso. Salve isso como colorem um diretório no seu $PATH(por exemplo, ~/binse estiver no seu $PATH):

#!/usr/bin/env perl

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

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

Em seguida, passe seu texto pelo script, fornecendo .como padrão o padrão e a cor correspondente:

captura de tela de um terminal executando o script

As cores suportadas dependem das habilidades do seu terminal. Para mais detalhes, consulte a documentação do Term::ANSIColorpacote.


Existe uma lista de cores válidas para passar em algum lugar?
George

@ George que depende da sua configuração. Se você possui um terminal compatível com RGB, pode usar coisas como rgb001, rgb123etc. Consulte perldoc.perl.org/Term/ANSIColor.html#Supported-Colors para obter mais detalhes.
terdon

23

Você usaria tputpara isso:

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

Isso pode ser usado para construir um tubo:

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

As cores básicas são respectivamente preto (0), vermelho (1), verde, amarelo, azul, magenta, ciano e branco (7). Você encontrará todos os detalhes na página de terminfo(5)manual .


6

Com zsh:

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

E depois:

$ echo "while" | blue
while

1

(conforme discutido nos comentários, usetput se você o tiver)

Usando o shell bourne e o echocomando (embutido) que compreende o escape ANSI \ecom a -eopção:

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

ou, script shell mais genérico (por exemplo /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=é necessário para impedir o corte de espaço em branco (consulte POSIX para obter detalhes).

como o IFS funciona


Eu aconselho a preferir usar tput.
LinuxSecurityFreak

Esta é uma solução completamente não portátil. Quero dizer que você deve aderir ao POSIX.
LinuxSecurityFreak

1
Claro, se pudéssemos. Ele se destina a ser usado em sistemas embarcados ou em ambientes de resgate como o busybox. Decidi escrever esta resposta porque acredito que esses trechos de código são úteis em algumas situações - pelo menos para usuários do busybox e para mim, que tiveram que produzir cores somente com os comandos internos do shell em um ambiente incorporado hoje.
Whaash

esqueci de dizer que o busybox comum não tem tput.
Whaash
Ao utilizar nosso site, você reconhece que leu e compreendeu nossa Política de Cookies e nossa Política de Privacidade.
Licensed under cc by-sa 3.0 with attribution required.