Đường ống lệnh thông qua bộ lọc màu


13

Có cái gì đó như thế này tồn tại trong Unix?

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

Ở đây tôi không có nghĩa là văn bản mã màu theo nghĩa đen sẽ xuất hiện (ví dụ như được dán trong một tệp). Tôi chỉ có nghĩa là cho văn bản thực sự hiển thị trong thiết bị đầu cuối như màu đó. Điều này có thể không?

Câu trả lời:


14

Đây là một kịch bản nhỏ làm điều đó. Lưu cái này như colortrong một thư mục trong của bạn $PATH(ví dụ: ~/binnếu trong thư mục của bạn $PATH):

#!/usr/bin/env perl

use strict;
use warnings;
use Term::ANSIColor; 

my $color=shift;
while (<>) {
    print color("$color").$_.color("reset");
} 

Sau đó, chuyển văn bản của bạn qua tập lệnh, đưa ra .mẫu phù hợp và chỉ định màu:

ảnh chụp màn hình của một thiết bị đầu cuối chạy tập lệnh

Các màu được hỗ trợ phụ thuộc vào khả năng của thiết bị đầu cuối của bạn. Để biết thêm chi tiết, xem tài liệu của Term::ANSIColorgói.


Có một danh sách các màu có giá trị để vượt qua ở đâu đó không?
George

@George mà phụ thuộc vào thiết lập của bạn. Nếu bạn có thiết bị đầu cuối có khả năng RGB, bạn thậm chí có thể sử dụng những thứ như rgb001, rgb123v.v. Xem perldoc.perl.org/Term/ANSIColor.html#Supported-Colors để biết thêm chi tiết.
terdon

23

Bạn sẽ sử dụng tputcho điều đó:

tput setaf 1
echo This is red
tput sgr0
echo This is back to normal

Điều này có thể được sử dụng để xây dựng một đường ống:

red() { tput setaf 1; cat; tput sgr0; }
echo This is red | red

Các màu cơ bản lần lượt là đen (0), đỏ (1), xanh lá cây, vàng, xanh dương, đỏ tươi, lục lam và trắng (7). Bạn sẽ tìm thấy tất cả các chi tiết trong terminfo(5)trang web .


6

Với zsh:

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

Và sau đó:

$ echo "while" | blue
while

1

(như đã thảo luận trong các bình luận, sử dụngtput thay thế nếu bạn có nó)

Sử dụng bourne shell và lệnh echo(tích hợp) để hiểu lối thoát ANSI \evới -etùy chọn:

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

hoặc, tập lệnh shell chung hơn (giả sử /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=là cần thiết để ngăn chặn việc cắt xén khoảng trắng (xem POSIX để biết chi tiết).

IFS hoạt động như thế nào


Tôi khuyên nên thích sử dụng tput.
LinuxSecurityFreak

Đây là giải pháp hoàn toàn không di động. Ý tôi là bạn nên tuân thủ POSIX.
LinuxSecurityFreak

1
Chắc chắn, nếu chúng ta có thể. Nó dự định sẽ được sử dụng trên các hệ thống nhúng hoặc môi trường cứu hộ như busybox. Tôi quyết định viết câu trả lời này vì tôi tin rằng các đoạn mã này hữu ích trong một số trường hợp - ít nhất là đối với người dùng busybox và đối với tôi, những người phải xuất màu chỉ bằng các lệnh tích hợp của shell trên môi trường nhúng ngày nay.
wataash

quên nói rằng busybox thông thường không có thông tin.
wataash
Khi sử dụng trang web của chúng tôi, bạn xác nhận rằng bạn đã đọc và hiểu Chính sách cookieChính sách bảo mật của chúng tôi.
Licensed under cc by-sa 3.0 with attribution required.