このようなものはUnixに存在しますか?
$ echo "this should show in red" | red
$ echo "this should show in green" | green
$ echo "this should show in blue" | blue
ここでは、リテラルカラーコードテキストが表示される(たとえば、ファイルに貼り付けられる)ことを意味していません。テキストが実際にその色としてターミナルに表示されることを意味します。これは可能ですか?
これを行う小さなスクリプトを次に示します。これを_$PATH
_のディレクトリにcolor
として保存します(たとえば、_~/bin
_にある場合は_$PATH
_):
_#!/usr/bin/env Perl
use strict;
use warnings;
use Term::ANSIColor;
my $color=shift;
while (<>) {
print color("$color").$_.color("reset");
}
_
次に、スクリプトにテキストを渡して、照合するパターンとして_.
_を指定し、色を指定します。
サポートされている色は、端末の機能によって異なります。詳細については、_Term::ANSIColor
_パッケージの documentation を参照してください。
そのためには 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)
manpage にあります。
zsh
の場合:
autoload colors; colors
for color (${(k)fg})
eval "$color() {print -n \$fg[$color]; cat; print -n \$reset_color}"
その後:
$ echo "while" | blue
while
(コメントで説明されているように、 使用している場合は代わりにtput
を使用)
ボーンシェルと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 [〜#〜] を参照)。