วางคำสั่งผ่านฟิลเตอร์สี


13

สิ่งนี้มีอยู่ใน Unix หรือไม่?

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

ที่นี่ฉันไม่ได้ตั้งใจให้ข้อความรหัสสีตัวอักษรปรากฏขึ้น (ตัวอย่างเช่นวางในไฟล์) ฉันแค่หมายถึงข้อความที่จะแสดงจริงใน terminal เป็นสีนั้น เป็นไปได้ไหม

คำตอบ:


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 ที่ขึ้นอยู่กับการตั้งค่าของคุณ หากคุณมีขั้ว 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) คุณจะพบรายละเอียดทั้งหมดในmanpageterminfo(5)



1

(ตามที่กล่าวไว้ในความคิดเห็นใช้tputแทนถ้าคุณมี)

ใช้echoคำสั่งbourne shell และ(ในตัว) ซึ่งเข้าใจคำสั่ง ANSI escape \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 ฉันตัดสินใจที่จะเขียนคำตอบนี้เพราะฉันเชื่อว่าข้อมูลโค้ดเหล่านี้มีประโยชน์ในบางสถานการณ์ - อย่างน้อยสำหรับผู้ใช้งาน busybox และสำหรับฉันที่ต้องแสดงผลสีด้วยคำสั่งในตัวของเชลล์ในสภาพแวดล้อมแบบฝังตัวเท่านั้น
wataash

ลืมที่จะพูดว่า busybox ธรรมดาไม่มี tput
wataash
โดยการใช้ไซต์ของเรา หมายความว่าคุณได้อ่านและทำความเข้าใจนโยบายคุกกี้และนโยบายความเป็นส่วนตัวของเราแล้ว
Licensed under cc by-sa 3.0 with attribution required.