Cách in lỗi tiêu chuẩn màu đỏ


14

Làm thế nào tôi có thể in lỗi tiêu chuẩn màu đỏ vào bàn điều khiển thay vì sử dụng cùng màu của đầu ra tiêu chuẩn?

Có thể sử dụng Gnome Terminal không?


Liên kết này có thể giúp bạn
devav2

Bạn có thể cho phép hành vi này cho một lệnh sử dụng các hilitetiện ích . Bạn phải tự nạp trước hilitelệnh shell của mình để sử dụng nó, nhưng nó vẫn hữu ích nếu bạn biết hoặc nghi ngờ rằng lệnh xuất ra lỗi và bạn muốn xác định vị trí của chúng.
Rory O'Kane

Câu trả lời:


8

Tôi sử dụng stderred và đã tìm thấy nó là một giải pháp tốt. Như readme ghi chú của nó :

Stderred hook trên write () và một họ các hàm luồng (fwrite, fprintf, error ...) từ libc để tô màu tất cả đầu ra stderr đi đến terminal do đó làm cho nó có thể phân biệt được với thiết bị xuất chuẩn. Về cơ bản, nó bao bọc văn bản đi đến tệp với bộ mô tả "2" với mã thoát ANSI thích hợp làm cho văn bản có màu đỏ.

Nó được triển khai như một thư viện dùng chung và không yêu cầu biên dịch lại các nhị phân hiện có nhờ tính năng tải trước / chèn của các trình liên kết động.

Nó được hỗ trợ trên Linux (với LD_PRELOAD), FreeBSD (cũng LD_PRELOAD) và OSX (với DYLD_INSERT_LIBRARIES).

Thật đơn giản để biên dịch, nhưng bạn cần phải xây dựng nó từ nguồn bằng cách làm theo các hướng dẫn từ trang Github của nó :

sudo apt-get install build-essential git cmake 

Sau đó

git clone git://github.com/sickill/stderred.git
cd stderred

Sau đó

make

Phần quan trọng nhất của nó là thêm dòng thích hợp vào của bạn .bashrc; bạn phải liên kết đến libstderred.sotệp trong thư mục xây dựng; bạn phải sử dụng đường dẫn tuyệt đối trong đó thư mục xây dựng là (/ home / mike / src / stderred / build). Tôi thêm các mục sau vào .bashrc:

export LD_PRELOAD="/home/mike/src/stderred/build/libstderred.so${LD_PRELOAD:+:$LD_PRELOAD}"

Rõ ràng, khi bạn không muốn sử dụng nó nữa, hãy xóa dòng trên khỏi .bashrcvà khởi động lại thiết bị đầu cuối.

Các kết quả, được thử nghiệm trên các tệp không tồn tại (rõ ràng nó sẽ không hoạt động khi sudođược sử dụng, vì người dùng .bashrcsẽ không được đọc khi môi trường khác nhau được đặt):

(Bằng cách này nó không biến công tước của tôi @ đỏ nhắc Nukem như đã được màu đỏ đã )

nhập mô tả hình ảnh ở đây


Không thể tin rằng tôi đã đi rất nhiều năm mà không biết rằng điều này tồn tại! Nó rất hữu ích và đáng lẽ phải là một phần của HĐH, ồ, đến nay đã một trăm năm. :)
Roger Dahl

6

Nói chung là có, vì Gnome Terminal là thiết bị đầu cuối ANSI và hỗ trợ mã thoát ANSI tiêu chuẩn.

Đây là một ví dụ. Nhập cái này vào terminal của bạn:

echo -e "\e[01;31mREDRUM\e[0m"

Các -etùy chọn cho phép để giải thích mã xuyệc ngược, do đó \etrở thành "Esc" (mã hex 0x1B). Ngoài ra, để vào thoát trực tiếp, nhấn ctrl-V Esc:

echo  "^[[01;31mREDRUM^[[0m"

Thoát và [cả hai cùng tạo thành mã được thiết bị đầu cuối nhận ra. Sau chuỗi đó, bạn cần chèn một ;danh sách các thuộc tính được phân tách bằng dấu hai chấm ( ), được kết thúc bởi m. Xem ở đây cho tất cả các mã. Các ví dụ bao gồm thuộc tính 0(đặt lại tất cả các thuộc tính, như bạn có thể nhận thấy ở trên, đó là chuỗi kết thúc ví dụ của tôi) và một loạt các kiểu (gạch chân, sáng, đậm, v.v.) cũng như một vài thuộc tính màu.

Câu trả lời ở trên cho bạn biết cách sử dụng màu sắc khi bạn viết chương trình của riêng bạn.

Tuy nhiên, nếu tôi hiểu chính xác câu hỏi của bạn, bạn muốn có một sự tách biệt trực quan cho thiết bị xuất chuẩn và thiết bị xuất chuẩn của bất kỳ chương trình nào bạn đang chạy. Điều này không đơn giản mà không phân tích đầu ra của chúng thông qua bộ lọc. Đây là một ví dụ (tìm thấy ở đây ) làm thế nào để làm điều đó:

  1. Xác định hàm (bạn có thể đặt nó vào tệp .bashrc):

    color() { "$@" 2>&1>&3|sed 's,.*,\x1B[31m&\x1B[0m,'>&2; } 3>&1
    
  2. Bắt đầu các chương trình như thế này:

    color program
    

Stderr từ các chương trình sẽ có màu đỏ.


Có cách nào để làm cho nó tô màu bất kỳ thông báo lỗi từ bất kỳ chương trình?
Luke
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.