Làm cách nào để thay đổi vĩnh viễn cả màu STDOUT và STDERR thành màu xám?


7

Câu hỏi này tương tự như Tôi có thể định cấu hình vỏ của mình để in STDERR và STDOUT với các màu khác nhau không?

Nhưng tôi đang tìm kiếm một giải pháp cho phép tôi thay đổi cả STDOUT và STDERR thành MỘT màu . Tôi không cố gắng đặt màu khác nhau cho STDOUT và STDERR, vì điều này có vấn đề và có thể tạo ra vấn đề, được đề cập trong câu trả lời từ liên kết ở trên.

Tôi xin lỗi, vì tôi không biết nhiều về Unix và Linux. Tôi đang tìm kiếm một giải pháp mà có thể cho phép tôi để thêm vài dòng để tôi .bashrchay .bash_profilevĩnh viễn thay đổi màu sắc của stdout và stderr.


Bạn có nghĩa là chỉ những gì được in bởi các chương trình phải không? Hay bạn chỉ muốn thay đổi màu mặc định của tất cả văn bản, bao gồm các lệnh bạn nhập?
terdon

chỉ những gì được in bởi các chương trình (ví dụ python, java output ...), ngoại trừ các lệnh tôi gõ
user1769197

Bạn có thể thử đặt thiết bị đầu cuối thành thứ gì đó không hỗ trợ màu. Đây là những hướng dẫn về cách thiết lập đó trên OS X .
Bratchley

Câu trả lời:


8

STDOUT và STDERR không có màu sắc. Những gì có màu sắc là thiết bị đầu cuối của bạn (trình giả lập); nó có một nền trước (và một màu nền) được đặt tại một thời điểm.

Cũng cần lưu ý rằng STDOUT và STDERR không phải là số ít - chúng là mỗi luồng đầu ra của quá trình . Không có STDOUT toàn cầu áp dụng cho tất cả các chương trình. Các luồng này được định tuyến đến thiết bị đầu cuối của bạn, nhưng chúng là riêng biệt cho từng quy trình.

Trình giả lập thiết bị đầu cuối thường có cách để thiết lập bảng màu thông qua menu, sao cho tiền cảnh mặc định (áp dụng cho dữ liệu nhận được qua cả hai luồng STDOUT và STDERR) có thể là bất cứ điều gì. Bạn cũng có thể áp dụng mã màu ANSI tại dấu nhắc của bạnnếu bạn không thiết lập lại màu sắc với \[\033[0m\]lúc kết thúc, nó sẽ tiếp tục được áp dụng. Lưu ý rằng một số ứng dụng sử dụng những thứ này và đặt lại, vì vậy đây không phải là một phương pháp rất lý tưởng, vì thiết lập lại sẽ trở về mặc định của thiết bị đầu cuối.

Nếu cài đặt nền trước của thiết bị đầu cuối không phải là điều bạn muốn, bạn có thể lọc STDOUT / STDERR trên cơ sở mỗi quy trình; xem đề xuất ở đây .


Vì vậy, bạn có thể viết cho tôi một mã sao cho STDOUT và STDERR sẽ được hiển thị bằng màu xám mỗi khi tôi thực thi tập lệnh python không? Tôi muốn điều này là vĩnh viễn, một cái gì đó mà tôi chỉ cần thêm vào của tôi .bashrc .
dùng1769197

@ user1769197, nói chung không phải là một ý tưởng hay để gây rối với đầu ra của các chương trình, vì chúng có thể xuất các chuỗi màu của chính chúng, điều này sẽ gây rối; cũng vậy, việc phát hiện các chương trình Java / Python / etc là không đáng tin cậy vì một số được gọi từ các trình bao bọc trong các ngôn ngữ khác (điển hình là các tập lệnh shell). Đặt cược an toàn nhất, đơn giản nhất của bạn là định cấu hình màu fg / bg mặc định trong ứng dụng đầu cuối của bạn như đề xuất goldilocks.
arielCo

Vì vậy, làm thế nào tôi nên định cấu hình nền trước và nền mặc định trong ứng dụng đầu cuối của mình sao cho MỌI THỜI GIAN tôi chạy tập lệnh python thì đầu ra sẽ xuất hiện với màu khác nhau và trở về màu fg / bg mặc định sau khi thực thi? Đây có phải là một cái gì đó mà tôi chỉ cần thêm vào .bashrckịch bản và hiệu ứng sẽ là vĩnh viễn?
dùng1769197

Đây có phải là thứ tôi chỉ cần thêm vào tập lệnh .bashrc và hiệu ứng sẽ là vĩnh viễn? Không, không có khả năng nào WRT nhắm mục tiêu các kịch bản python cụ thể, v.v ... Đó sẽ là một tính năng không tồn tại của python. Tuy nhiên, bạn có thể sử dụng tập lệnh shell ngắn đặt màu, sau đó thực thi lệnh của bạn. Thiết lập màu sắc đòi hỏi echoing mã thoát ANSI đề cập trong các liên kết khác nhau và câu trả lời (và một đoạn giới thiệu ở đây , nhưng một lần nữa, hãy cẩn thận rằng bất cứ điều gì bạn có thể ghi đè chạy này).
goldilocks

7

Với các zshthiết bị đầu cuối hỗ trợ 16 màu trở lên xterm:

preexec() printf '\e[90m' # set foreground color to grey before running
                          # the command

precmd() printf '\e[m' # reset the foreground color before issuing the
                       # next prompt.

Lưu ý rằng các lệnh có thể tự thay đổi màu nền trước của thiết bị đầu cuối.


Tôi đặt mã của bạn trên của tôi .bashrc. Nhưng không có gì xảy ra. Tại sao chuyện này đang xảy ra ?
dùng1769197

2
@ user1769197, .bashrclà dành cho bashvỏ. Giải pháp này là dành cho zsh.
Stéphane Chazelas

1
Xem ở đó để biết bashtương đương, nhưng vì bạn đang sử dụng OS / X, không có lý do gì bạn sẽ không sử dụng zshvì nó phải được cài đặt theo mặc định (thậm chí nó từng là vỏ hệ thống ở đó).
Stéphane Chazelas

1

Đây có vẻ là một câu hỏi với vấn đề XY - nó không hỏi đúng điều gì để có được giải pháp mong muốn:

Giả sử đầu ra được tô màu và phần trống của màn hình có màu khác nhau hoặc chứa đầy một ký tự.

Hãy suy nghĩ về cách bạn mong đợi đầu ra để tìm kiếm các trường hợp này:

Một dòng trống ? Dòng chỉ chứa đầy ký tự không gian? Dòng chỉ có một ký tự không gian ? Với một tab? Với một không gian và một tab? Với một tab và một không gian? Vâng, tất cả đều trông khác nhau. !

Hay bạn muốn một dòng trống trông giống như - chỉ là một dòng trống ?
Nếu đó là trường hợp, bạn thực sự không muốn tô màu các luồng đầu ra, và câu trả lời này được áp dụng .


Tôi sẽ đưa ra một cách tiếp cận tương tự với giải pháp của @ StéphaneChazelas, nhưng "nghịch đảo":

Về mặt kỹ thuật, bạn có thể tô màu STDOUT và STDERR, theo từng dòng , bằng cách thêm mã thoát màu phù hợp để bắt đầu và kết thúc dòng trên cả hai luồng.

Bạn sẽ cần phải cẩn thận để đặt lại màu ít nhất là mỗi dòng, vì nếu không, bất kỳ chương trình nào sử dụng màu, như ls, sẽ làm rối thiết bị đầu cuối của bạn .
Bạn khôngnhiều quyền kiểm soát màu đầu ra - vì vậy thật khó để có được đúng nhất.

Nhưng: Bạn có quyền kiểm soát tất cả các màu khác được sử dụng, phải không?
Và bạn chỉ cần một màu trong trường hợp này? Tuyệt quá!

Đặt màu mặc định của thiết bị đầu cuối thành màu STDOUT / STDERR và tô màu phần còn lại như bạn muốn.

Bạn có thể tô màu cho dấu nhắc của bạn - và sử dụng mã nhắc để tô màu các phần khác.
Phải thừa nhận rằng việc tô màu dòng lệnh , nơi bạn chỉnh sửa lệnh của mình, nhưng chắc chắn là có thể. Nhưng đừng cố gắng rằng với bashnếu bạn có thể sử dụng zsh, như là đang xử lý kịp thời nó nhiều linh hoạt hơn có - đó là những gì bạn sẽ cần.

Bây giờ, đặt màu nền trước mặc định của bạn thành màu xám và có thể là nền - nhưng cố gắng để màu đó trong suốt / không xác định.

Để đặt màu nền của dòng lệnh, hãy xem ví dụ này từ Thay đổi màu nền của dòng lệnh trong zsh khi tôi thay đổi chủ đề nhắc :

PROMPT="%{$bg[cyan]%}%{$fg[red]%}%n%{$reset_color%}%{$bg[cyan]%}@%{$fg[red]%}%m %{$fg[yellow]%}%~ %{$reset_color%}%{$bg[cyan]%}%% "

ví dụ nhắc nhở shell

(Phần khó là lấy phần cuối của các ô không sử dụng trong các tình huống khác nhau.)

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.