컬러 필터를 통해 명령 전달

컬러 필터를 통해 명령 전달

유닉스에 그런 것이 존재합니까?

$ 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 작동 방식

관련 정보