Проведення команди через кольоровий фільтр


13

Чи існує щось подібне в Unix?

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

Тут я не маю на увазі, щоби з'являвся буквальний текст кольорового коду (який потрібно вставити у файл, наприклад). Я просто маю на увазі, щоб текст фактично відображався в терміналі як цей колір. Чи можливо це?

Відповіді:


14

Ось невеликий сценарій, який робить саме це. Збережіть це як colorу каталозі у своєму $PATH(наприклад, ~/binякщо він є у вашому $PATH):

#!/usr/bin/env perl

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

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

Потім переведіть текст через сценарій, подавши .як узор, що відповідає, і вказавши колір:

скріншот терміналу, на якому працює сценарій

Підтримувані кольори залежать від можливостей вашого терміналу. Детальніше дивіться в документації до Term::ANSIColorпакета.


Чи є список кольорів, які дійсно десь передаються?
Джордж

@ Джордж, що залежить від вашого налаштування. Якщо у вас є термінал, що підтримує RGB, ви навіть можете користуватися такими речами, як rgb001і rgb123т. Д. Докладнішу інформацію див.
terdon

23

Ви б використовували tputдля цього:

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

Це можна використовувати для побудови труби:

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

Основними кольорами є відповідно чорний (0), червоний (1), зелений, жовтий, синій, пурпурний, блакитний та білий (7). Ви знайдете всі подробиці в terminfo(5)сторінках керівництва .


6

З zsh:

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

І потім:

$ echo "while" | blue
while

1

(як обговорюється в коментарях, використовуйтеtput натомість, якщо у вас є)

Використовуючи оболонку Bourne та echo(вбудовану) команду, яка розуміє вхід ANSI \eз -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

або, більш загальний сценарій оболонки (скажімо, /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=потрібен для запобігання обрізання пробілів (детальніше див. POSIX ).

як працює IFS


Раджу віддати перевагу використанню tput.
LinuxSecurityFreak

Це абсолютно не портативне рішення. Я маю на увазі, що ви повинні дотримуватися POSIX.
LinuxSecurityFreak

1
Звичайно, якби ми могли. Він призначений для використання у вбудованих системах або рятувальних середовищах, таких як busybox. Я вирішив написати цю відповідь, тому що вважаю, що ці фрагменти коду корисні в деяких ситуаціях - принаймні для користувачів зайнятих ящиків і для мене, яким сьогодні довелося виводити кольори лише за допомогою вбудованих команд оболонки у вбудованому середовищі.
wataash

забув сказати, що у звичайній службовій скриньці немає tput.
wataash
Використовуючи наш веб-сайт, ви визнаєте, що прочитали та зрозуміли наші Політику щодо файлів cookie та Політику конфіденційності.
Licensed under cc by-sa 3.0 with attribution required.