Làm thế nào để tôi ống màu đầu ra khác nhau để ít hơn?


37

Tôi đã sử dụng git diff, tạo ra đầu ra màu. Tuy nhiên, bây giờ tôi thấy tôi cần sử dụng diff khác thường cho một cái gì đó, và nó tạo ra rất nhiều đầu ra khó đọc vì thiếu màu sắc. Làm thế nào để tôi làm cho diff tạo ra một đầu ra màu, có thể đọc được? Lý tưởng nhất là trong khi đường ống đến ít hơn, để dễ dàng xem xét các tệp lớn.

Câu trả lời:


32

diffKhông thể xuất màu, bạn cần một chương trình khác, chẳng hạn như colordiffcho điều đó. Màu sắc trong thiết bị đầu cuối được in thông qua mã thoát ANSI mà ít được giải thích theo mặc định. Để lesshiển thị chính xác màu sắc, bạn cần -r, hoặc thậm chí tốt hơn, -Rchuyển đổi:

colordiff -- "$file1" "$file2" | less -R

Từ man less:

   -R or --RAW-CONTROL-CHARS
          Like -r, but only ANSI  "color"  escape  sequences  are
          output in "raw" form.  Unlike -r, the screen appearance
          is maintained correctly in most  cases.   ANSI  "color"
          escape sequences are sequences of the form:

               ESC [ ... m

          where  the  "..."  is  zero or more color specification
          characters For the purpose of keeping track  of  screen
          appearance,  ANSI color escape sequences are assumed to
          not move the cursor.  You  can  make  less  think  that
          characters  other  than  "m"  can end ANSI color escape
          sequences by setting the environment  variable  LESSAN‐
          SIENDCHARS  to  the  list of characters which can end a
          color escape sequence.  And you  can  make  less  think
          that characters other than the standard ones may appear
          between the ESC and the m by  setting  the  environment
          variable  LESSANSIMIDCHARS  to  the  list of characters
          which can appear.

Ngoài ra, bạn có thể sử dụng moresẽ hiển thị màu chính xác theo mặc định.


Nếu bạn không thể cài đặt các chương trình bên ngoài, bạn sẽ có thể nhận được cùng một đầu ra bằng cách sử dụng một cách tiếp cận thủ công hơn:

diff a b | 
   perl -lpe 'if(/^</){$_ = "\e[1;31m$_\e[0m"} 
              elsif(/^>/){$_ = "\e[1;34m$_\e[0m"}'

1
Và nếu ai đó muốn xem tỷ lệ phần trăm của dữ liệu được hiển thị, họ phải sử dụng less -RM +Gg: superuser.com/questions/64972/
mẹo

13

Các câu trả lời khác ở đây có thể đã lỗi thời. Vì coreutils 3.5 diffthực sự có thể tạo ra đầu ra màu được tắt theo mặc định khi thiết bị xuất chuẩn không phải là bàn điều khiển.

Từ trang người đàn ông:

--color[=WHEN]
tô màu đầu ra; WHENcó thể never, alwayshoặc auto(mặc định)

Để buộc đầu ra màu khi thiết bị xuất chuẩn là một đường ống diff --color=always -- "$file1" "$file2" | less -Rnên hoạt động.


Bạn cũng có thể bao gồm alias diff='diff --color=always'trong một .bashrchoặc .zshrctập tin.
jftuga

1
Vâng. Tôi đang sử dụngalias diff='diff --side-by-side --left-column --color=always'
Kshitiz Sharma

Tôi sử dụng alias diff='/usr/bin/diff --color=always 'alias less='/usr/bin/less -r 'mặc dù khác biệt ban đầu được tô màu trên một vài trang đầu tiên ít hơn nhưng trên các khác biệt dài đôi khi nó trở lại đơn sắc. Điều này có thể là trên các bước nhảy rõ ràng sẽ không ảnh hưởng đến diff, vì đầu ra của nó chỉ được tạo một lần và không phải nhảy, nhưng bằng cách nào đó, ít mất dấu vết của màu sắc.
NeilG

8

Để ống màu khác nhau ít hơn:

diff $file1 $file2 | colordiff | less -r

Để làm cho nó dễ đọc hơn, bằng cách giới hạn nó ở một màn hình duy nhất:

diff -uw $file1 $file2 | colordiff | less -r

Và, để khiến ít hiển thị hơn nếu chỉ có một màn hình có giá trị nội dung:

diff -uw $file1 $file2 | tee /dev/stderr | colordiff | less -r -F

-F gây ra ít đóng hơn ngay lập tức nếu có ít hơn một màn hình nội dung, đường ống đến stderr là vì khi đóng ít hơn, bạn sẽ mất đầu ra - bằng cách chuyển sang stderr, nó sẽ xuất ra ngay cả khi ít hiển thị hơn.

Một cách khác (và, tôi nghĩ, tốt hơn), là chỉ sử dụng -X để ngăn chặn việc xóa màn hình ít hơn:

diff -uw $file1 $file2 | colordiff | less -r -X -F

Điều này làm việc tốt cho tôi, nhưng có thể là cụ thể cho bash. colordiff không phải là một tích hợp, nhưng dễ dàng cài đặt.


2
Lệnh duy nhất anh ta cần làless -r
sendmoreinfo
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.