Mã thoát ANSI của tôi sẽ đi đâu khi tôi chuyển sang quy trình khác? Tôi có thể giữ chúng không?


36

Thỉnh thoảng tôi muốn chuyển đầu ra được mã hóa màu thành một quá trình, ví dụ. grep ... nhưng khi tôi chuyển nó sang một quy trình khác, vd. sed, mã màu bị mất ...

Là một số cách để giữ cho các mã này còn nguyên vẹn?

Dưới đây là một ví dụ làm mất đầu ra màu:

echo barney | grep barney | sed -n 1,$\ p   

4
PS .. như thông tin chung .. Tôi vừa phát hiện ra rằng lesscó thể chấp nhận nhập văn bản được tô màu (đẹp :) ... ví dụ: tree -C ~/ |less -Rhoặcls -lR --color=always . |less -R
Peter.O

Câu trả lời:


40

Nhiều chương trình tạo đầu ra màu phát hiện nếu chúng đang ghi vào TTY và tắt màu nếu không. Điều này là do mã màu gây khó chịu khi bạn chỉ muốn chụp văn bản, vì vậy chúng cố gắng tự động "làm đúng".

Cách đơn giản nhất để nắm bắt đầu ra màu từ một chương trình như thế là bảo nó ghi màu ngay cả khi nó không được kết nối với TTY. Bạn sẽ phải đọc tài liệu của chương trình để tìm hiểu xem nó có tùy chọn đó không. (ví dụ: grep--color=alwaystùy chọn.)

Bạn cũng có thể sử dụng expecttập lệnh unbufferđể tạo một giả như thế này:

echo barney | unbuffer grep barney | sed -n 1,$\ p

2
cảm ơn vì thông tin đó về phát hiện TTY và trình giả mạo unbuffer!
shellter

@cjm .. Nó không hoạt động ở đây (trên Ubuntu 10.04 / bash 4.1.5) ... nhưng repo 10.04 của tôi chỉ có phiên bản -dev và không có gì trong backport ... Ở đây hơi muộn, vì vậy tôi sẽ xem xét một lần nữa vào ngày mai ... nhưng như bạn đã nói, các chương trình tô màu này có thể chuyển đổi theo đích đầu ra (mhhh nhưng làm sao họ biết đó là goiong to tty..không có vấn đề gì) .. và họ cũng có thể có một tùy chọn để buộc nó .. cảm ơn ,,,
Peter.O

@fred, họ thường sử dụng isatty để tìm xem stdoutđi đâu. Tôi thực sự không chắc chắn nếu unbufferhoạt động khi bạn tham gia chương trình cũng như ngoài chương trình; Tôi không cài đặt nó ở đây để thử.
cjm

cảm ơn unbufferthông tin, nó giúp đầu ra của IRC bot của tôi giống như đầu ra trong shell.
LiuYan 刘

4

Nó làm việc cho tôi; -! (trong môi trường MingW hiện tại)

echo barney | grep --color=always barney | sed -n '1,$p'
**barney**

# barney hiển thị dưới dạng văn bản màu đỏ

$ grep --version
GNU grep 2.5.4

$ sed --version
GNU sed version 4.2.1

@shellter ... vâng, ví dụ grep cụ thể này cũng phù hợp với tôi .. Tôi không biết tùy chọn đó cho đến khi bạn đăng câu trả lời, vì vậy cảm ơn vì điều đó ... Tuy nhiên. Tôi vẫn tự hỏi liệu có một số cách chung để làm điều này .... ví dụ tree is colorized a-la dircolors if the LS_COLORS environment variable is set and output is to tty ... Có lẽ (?) Có một cách để lừa một đường ống nghĩ rằng nó đang xuất ra một TTY .. hoặc một số cách giải quyết chung như vậy. .
Peter.O

Tôi vừa mới kiểm tra man tree... Nó cũng có một tùy chọn tương tự, -C... có lẽ đó là một tính năng phổ biến cho các chương trình xuất mã thoát màu ..
Peter.O
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.