컬러 필터를 통해 명령 파이핑


13

유닉스에 이런 것이 있습니까?

$ 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.


어딘가에 전달할 수있는 색상 목록이 있습니까?
George

설정에 따라 @George 당신은 RGB-가능 단말기가있는 경우, 당신도 일을 좋아 사용할 수 있습니다 rgb001, rgb123등을 참조 perldoc.perl.org/Term/ANSIColor.html#Supported-Colors을 자세한 내용은.
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 '

일반 busybox에는 입력이 없다는 것을 잊어 버렸습니다.
wataash '
당사 사이트를 사용함과 동시에 당사의 쿠키 정책개인정보 보호정책을 읽고 이해하였음을 인정하는 것으로 간주합니다.
Licensed under cc by-sa 3.0 with attribution required.