カラーフィルタを介してコマンドを渡す

カラーフィルタを介してコマンドを渡す

Unixにはそのようなものがありますか?

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

ここでは、テキストカラーコードのテキスト(ファイルに貼り付けなど)として表示されるわけではありません。私の言葉は、テキストが実際に端末にその色で表示されるようにすることです。可能ですか?

答え1

あなたは使用します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)マンページ

答え2

ここにこれを行う小さなスクリプトがあります。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

答え3

そしてzsh

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

それから:

$ echo "while" | blue
while

答え4

(コメントで説明したように、使用tput代わりにお持ちの場合)

ANSIエスケープオプションを理解するには、Bourneシェルとecho(組み込み)コマンドを使用します。\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の仕組み

関連情報