Giữ màu trong khi đường ống đến tee


Câu trả lời:


84

Đơn giản chỉ cần chèn unbuffertrước bất kỳ lệnh nào để làm cho nó nghĩ rằng nó đang ghi vào một đầu ra tương tác ngay cả khi nó thực sự được chuyển sang một tệp thực thi khác. Điều này sẽ giữ màu trong trường hợp ls.

Ví dụ

unbuffer ls -l --color=auto | tee output.log

Nếu bạn chưa cài đặt nó, trên Ubuntu và các bản phân phối Linux khác của Debian bạn có thể cài đặt unbufferbằng cách thực hiện.

sudo apt-get install expect-dev

6
Một giải pháp khác, không yêu cầu cài đặt bất cứ thứ gì, là tại stackoverflow.com/questions/3515208/ trên
Tgr

3
Điều này khiến tệp kết quả chứa mã màu (tất nhiên); Có cách nào để sau đó in tệp theo cách sử dụng mã màu và hiển thị đúng màu trong thiết bị đầu cuối không?
Kyle Strand

2
Ugh, điều đó làm cho các mục nhập mật khẩu hiển thị mật khẩu của bạn trong Cleartext!
AndiDog

@Tgr Giải pháp đó không hiệu quả đối với tôi trên OS X khi cố lấy đầu ra màu thô xcodebuild- thay vào đó tôi có các đường cắt nhỏ không có màu. unbuffer xcodebuild | less -Rlàm việc hoàn hảo, tuy nhiên.
Slipp D. Thompson

2
Bạn không cần expect-devgói. expectLà đủ.
Yajo

11

Sử dụng tùy chọn ls --color=always

--color=auto sẽ không tô màu đầu ra cho một đường ống - vì lý do rõ ràng.

Trang chính cho biết như sau:

Với --color = auto, mã màu chỉ được xuất nếu đầu ra tiêu chuẩn được kết nối với thiết bị đầu cuối (tty).


2
ĐỒNG Ý. Giải thích nó. Nhưng tôi vẫn có thể bằng cách nào đó nhìn thấy màu sắc trên màn hình? (Rốt cuộc là một TTY). Tôi không phiền KHÔNG có chúng trong logfile, nhưng tôi chắc chắn muốn chúng trên màn hình của mình.
Paweł Gościcki

Tôi nghĩ rằng tôi làm cho mình không đủ rõ ràng. ls -lchỉ là một ví dụ. Tôi có một lệnh hoàn toàn khác (nhật ký heroku) dải màu khi được dẫn tới tee. Và tôi muốn "sửa / thay đổi" tee / pipe chứ không phải lệnh tôi đang thực thi.
Paweł Gościcki

1
@Pawel, bạn không thể dễ dàng sửa nó trong tee / pipe vì tee / pipe không tước các mã màu này. Vấn đề là lệnh ban đầu thấy nó không ghi vào thiết bị đầu cuối. Bạn cần một thiết bị đầu cuối giả hoạt động như một đường ống nhưng lệnh này xem như một thiết bị đầu cuối.
RedGrittyBrick

Hừm ... đủ công bằng. Tôi đoán tôi chỉ cần chấp nhận rằng nó là như vậy.
Paweł Gościcki

3
@ PawełGościcki câu trả lời này chỉ khắc phục vấn đề cho ls. Xem câu trả lời của tôi khắc phục sự cố cho tất cả các chương trình, bao gồm nhật ký heroku.
Eamonn O'Brien-Strain

3

Tôi sẽ mở rộng scriptgiải pháp được đưa ra trong nhận xét của câu trả lời được chấp nhận. Việc sử dụng scriptcó thể hữu ích trong trường hợp bạn không thể hoặc không muốn cài đặt gói mong đợi có chứa unbufferlệnh.

In ls đầu ra ra thiết bị xuất chuẩn và tập tin với mã màu :

script -efq output.log -c "ls -l --color=auto"

trong đó ( man script):

  -e, --return
         Return the exit code of the child process.  Uses the same
         format as bash termination on signal termination exit code is 128+n.
  -f, --flush
         Flush output after each write.  This is nice for telecooperation:
        one person does `mkfifo foo; script -f foo', and another can 
        supervise real-time what is being done using `cat foo'.
  -q, --quiet
         Be quiet (do not write start and done messages to either 
         standard output or the typescript file).

Xem tập tin đầu ra với màu sắc:

less -r output.log

2
-egiống như --return- không cần cả hai; -efq--return --flush --quiet.
Noel Maersk

@NoelMaersk Cảm ơn. Tôi kết hợp các giải thích tham số trong câu trả lời.
Juuso Ohtonen
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.