lệnh bash watch với màu sắc được bảo tồn


57

Từ man watch:

Các ký tự không in được tước khỏi đầu ra chương trình. Sử dụng "cat -v" như một phần của đường dẫn lệnh nếu bạn muốn xem chúng.

Vậy làm thế nào để tôi sử dụng cat -vnếu tôi muốn xem đầu ra màu từ:

watch ls -al --color

Câu trả lời:


63

Lệnh đúng là

watch --color "ls -a1 --color"

Nó không được ghi lại trong trang man hoặc màn hình --help. Tôi phải sử dụng chuỗi để tìm nó.


@ PawełGościcki Nevermind, mặc dù đã tìm thấy nó trên gitorious, mặc dù, không thể làm cho nó hoạt động với phpunit.
Ikke

1
Đồng hồ của tôi là v0.3.0 và tôi đang dùng Ubuntu 10.0
Paweł Gościcki

2
Tôi cũng đã có phiên bản 0.3.0 và đối với "ls --color" đơn giản, lệnh đồng hồ sẽ hoạt động nhưng vì một số lý do, các kịch bản phức tạp hơn không: watch --color "sudo iwlist wlan0 scanning | egrep 'Quality|ESSID' | egrep --color -i 'foobar|$'"sẽ ăn màu :(
math

@math: Hãy thử hoán đổi dấu ngoặc đơn và dấu ngoặc kép của bạn.
Dennis Williamson

Các watchtừ procps (mặc định trên hầu hết các distro Linux, tôi tin rằng) có một --colortùy chọn từ V3.3.2.
sleske

27

Tôi nghĩ rằng nó có thể là không thể với lệnh 'xem'. Đây là một cách dài hơn để làm điều đó:

while true; do clear; date;echo;ls -al --color; sleep 2; done

Bạn có thể đặt điều này trong một tập lệnh, ví dụ:

echo "while true; do clear; date;echo;\$*;sleep 2; done" > watch2
chmod +x watch2
./watch2 ls -al --color

Để làm rõ, đây là lý do tại sao tôi nghĩ rằng điều đó là không thể với lệnh 'xem'. Xem điều gì xảy ra nếu bạn sử dụng mèo -v:

watch "ls -al --color|cat -v"

Nó cho bạn thấy các ký tự điều khiển màu ... mà tôi nghĩ không phải là thứ bạn muốn.


man watchrõ ràng gợi ý rằng nó nên có thể mà không cần mổ xẻ watch.
Paweł Gościcki

Nó không nói rằng bạn sẽ có thể nhìn thấy màu sắc. Nó nói rằng bạn sẽ có thể thấy các ký tự không in được. Hãy thử lệnh của tôi như trên với cat -vđể xem những gì man watchđang nói về.
davr

1
Bạn có thể giảm thời lượng chớp mắt một chút bằng cách a) thu thập dữ liệu sẽ được hiển thị thành một biến, b) xóa màn hình, c) in biến.
Nick Russo

1
@NickRusso cảm ơn vì lời đề nghị. Một cái gì đó như thế này làm giảm đáng kể sự nhấp nháy:while true; do out=$(date;echo;ls -al --color);clear;echo $out;sleep 2;done
Kevin Mark

1
@KevinMark: Bạn nên sử dụng dấu ngoặc kép để xử lý nhiều dòng : echo "$out". stackoverflow.com/q/2414150/86967
tộc

6

Nếu bạn đang sử dụng máy Mac, như tôi, watchtừ Homebrew không hỗ trợ màu.

Những gì bạn muốn là fswatch nhưng nó chưa phải là Homebrew. Để cài đặt, bạn sẽ muốn làm một chút phức tạp hơn

https://raw.github.com/mlevin2/homebrew/116b43eaef08d89054c2f43579113b37b4a2abd3‌​/Library/Formula/fswatch.rb

Xem câu trả lời SO này để sử dụng.


2
Điều này chỉ hoạt động cho hệ thống tập tin, trong khi watcháp dụng cho một lệnh
Brice

fswatch khả dụng trên Homebrew 0.9.5
code_monk

1

CẬP NHẬT : Hóa ra các phiên bản mới nhất đã watchkhắc phục sự cố. Vì vậy, nếu màu sắc watch --colorsai, có lẽ tốt hơn là chỉ cập nhật nó (trên hệ thống của tôi, nó nằm trong procpsgói).


Sự hỗ trợ màu sắc watch --colorbị hạn chế theo kinh nghiệm của tôi (mặc dù đủ cho ls -l --color). Đây là phiên bản trả lời của @ davr với một số tính năng bổ sung, quan trọng nhất là giảm nhấp nháy. Bạn có thể đặt nó trong .bashrc của bạn và sử dụng nó như cwatch ls -l --color.

# `refresh cmd` executes clears the terminal and prints
# the output of `cmd` in it.
function refresh {
  tput clear || exit 2; # Clear screen. Almost same as echo -en '\033[2J';
  bash -ic "$@";
}

# Like watch, but with color
function cwatch {
   while true; do
     CMD="$@";
     # Cache output to prevent flicker. Assigning to variable
     # also removes trailing newline.
     output=`refresh "$CMD"`;
     # Exit if ^C was pressed while command was executing or there was an error.
     exitcode=$?; [ $exitcode -ne 0 ] && exit $exitcode
     printf '%s' "$output";  # Almost the same as echo $output
     sleep 1;
   done;
}

Bạn cũng có thể thử những thứ như

cwatch 'ls -l --color | head -n `tput lines`'

nếu thiết bị đầu cuối của bạn có ít dòng hơn đầu ra. Điều đó chỉ hoạt động nếu tất cả các dòng ngắn hơn chiều rộng thiết bị đầu cuối, mặc dù. Cách giải quyết tốt nhất mà tôi biết đó là:

cwatch 'let lines=`tput lines`-2; ls -l --color | head -n $lines'
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.