polecenie bash watch z zachowanymi kolorami

57

Od man watch:

Znaki niedrukowalne są usuwane z wyników programu. Użyj „cat -v” jako części potoku poleceń, jeśli chcesz je zobaczyć.

Jak więc użyć, cat -vjeśli chcę zobaczyć kolorowe wyjście z:

watch ls -al --color
Paweł Gościcki
źródło

Odpowiedzi:

63

Prawidłowe polecenie to

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

Nie jest to udokumentowane na stronie podręcznika ani na ekranie --help. Muszę go użyć, aby go znaleźć.

koń papierowy
źródło
@ PawełGościcki Nevermind, już uznał to za genialne, chociaż nie udało mu się zmusić go do współpracy z phpunit.
Ikke
1
Mój zegarek to v0.3.0 i jestem na Ubuntu 10.0
Paweł Gościcki
2
Mam również wersję 0.3.0 i dla prostego „ls --color” polecenie watch będzie działać, ale z jakiegoś powodu bardziej złożone scenariusze nie: watch --color "sudo iwlist wlan0 scanning | egrep 'Quality|ESSID' | egrep --color -i 'foobar|$'"zjadają kolory :(
matematyka
@ matematyka: spróbuj zamienić swoje pojedyncze i podwójne cudzysłowy.
Dennis Williamson
watchZ procps (domyślna w większości dystrybucji Linuksa, wierzę) ma --coloropcję, ponieważ V3.3.2.
sleske
27

Myślę, że może to nie być możliwe z poleceniem „obserwuj”. Oto dłuższy sposób na zrobienie tego:

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

Możesz umieścić to w skrypcie, na przykład:

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

Aby to wyjaśnić, oto dlaczego myślę, że nie jest to możliwe dzięki poleceniu „obserwuj”. Zobacz, co się stanie, jeśli użyjesz cat -v:

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

Pokazuje znaki sterujące kolorem ... które moim zdaniem nie są tym, czego chcesz.

davr
źródło
man watchwyraźnie sugeruje, że powinno to być możliwe bez pogardy watch.
Paweł Gościcki
Nie oznacza to, że będziesz w stanie zobaczyć kolory. Mówi, że będziesz mógł zobaczyć znaki, które nie będą drukowane. Wypróbuj moje polecenie jak wyżej, cat -vaby zobaczyć, o czym man watchmówiłeś.
davr
1
Możesz trochę skrócić czas mrugnięcia o a) zbieranie danych, które mają być wyświetlane w zmiennej, b) czyszczenie ekranu, c) drukowanie zmiennej.
Nick Russo
1
@NickRusso dzięki za sugestię. Coś takiego znacznie zmniejsza migotanie:while true; do out=$(date;echo;ls -al --color);clear;echo $out;sleep 2;done
Kevin Mark
1
@KevinMark: Należy użyć cudzysłowów obsługiwać kilka linii: echo "$out". stackoverflow.com/q/2414150/86967
nobar
6

Jeśli używasz komputera Mac, takiego jak ja, watchHomebrew nie obsługuje kolorów.

To, czego chcesz, to fswatch, ale nie jest to jeszcze Homebrew. Aby go zainstalować, musisz zrobić nieco bardziej skomplikowany

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

Zobacz tę odpowiedź SO dotyczącą użytkowania.

fatuhoku
źródło
2
Działa to tylko dla systemu plików, a watchdotyczy polecenia
Brice
fswatch jest dostępny na Homebrew 0.9.5
code_monk
1

AKTUALIZACJA : okazuje się, że najnowsze wersje watchrozwiązały problem. Jeśli więc kolory watch --colorsą nieprawidłowe, prawdopodobnie lepiej po prostu je zaktualizować (w moim systemie jest w procpspakiecie).


Obsługa kolorów watch --colorw moim doświadczeniu jest ograniczona (choć wystarczająca ls -l --color). Oto moja wersja odpowiedzi @ davr z kilkoma dodatkowymi funkcjami, przede wszystkim zmniejszonym migotaniem. Możesz umieścić go w swoim .bashrc i używać go jako 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;
}

Możesz także spróbować takich rzeczy jak

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

jeśli twój terminal ma mniej linii niż wyjście. Działa to tylko wtedy, gdy wszystkie linie są krótsze niż szerokość terminala. Najlepsze obejście, jakie znam na to:

cwatch 'let lines=`tput lines`-2; ls -l --color | head -n $lines'
user21952-is-a-great-name
źródło