Bash Watch-Befehl mit erhaltenen Farben

20453
Paweł Gościcki

Von man watch:

Nicht druckbare Zeichen werden aus der Programmausgabe entfernt. Verwenden Sie "cat -v" als Teil der Befehlspipeline, wenn Sie sie sehen möchten.

Wie verwende ich also, cat -vwenn ich die farbige Ausgabe von sehen möchte:

watch ls -al --color 
44

5 Antworten auf die Frage

48
paperhorse

Der richtige Befehl ist

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

Es ist weder in der Manpage noch im --help-Bildschirm dokumentiert. Ich muss Strings verwenden, um es zu finden.

@ PawełGościcki Nevermind, fand es bereits auf gitorious, obwohl er es nicht schaffen konnte, mit phpunit zu arbeiten. Ikke vor 12 Jahren 0
Meine Uhr ist v0.3.0 und ich bin auf Ubuntu 10.0 Paweł Gościcki vor 12 Jahren 1
Ich habe auch Version 0.3.0 und für einfache "ls --color" funktioniert der Befehl watch, aus komplexeren Szenarien jedoch nicht: `watch --color" sudo iwlist wlan0 Scannen | egrep 'Qualität | ESSID' | egrep --color -i 'foobar | $' "` frisst die Farben :( math vor 12 Jahren 2
@math: Tauschen Sie Ihre einfachen und doppelten Anführungszeichen aus. Dennis Williamson vor 12 Jahren 0
Die "watch" von procps (der Standard bei den meisten Linux-Distributionen, glaube ich) hat seit V3.3.2 die Option "--color". sleske vor 11 Jahren 0
Beachten Sie, dass die Version 3.3.2 nur in procps-ng verfügbar ist. Ursprüngliches procps.sf.net scheint die Entwicklung vor Jahren gestoppt zu haben (Version ist immer noch 3.2.8 und Version 0.2.0). Beachten Sie auch OSX / Darwin-Benutzer, dass der neue und gewartete Zweig von procps-ng noch nicht mit LLVM unter OSX kompiliert wird (siehe https://github.com/Homebrew/homebrew/pull/20845). Brice vor 10 Jahren 0
Wie aktualisierst du deine Uhrenversion? Adam Hunyadi vor 7 Jahren 0
25
davr

Ich denke, dass es mit dem Befehl 'watch' nicht möglich ist. Hier ist ein längerer Weg:

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

Sie könnten dies beispielsweise in ein Skript einfügen:

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

Um dies zu verdeutlichen, glaube ich, dass dies mit dem Befehl 'watch' nicht möglich ist. Sehen Sie, was passiert, wenn Sie cat -v verwenden:

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

Es zeigt Ihnen die Farbsteuerungszeichen ... was ich denke, ist nicht das, was Sie wollen.

"man watch" legt eindeutig nahe, dass es möglich sein sollte, ohne "watch" zu dissen. Paweł Gościcki vor 14 Jahren 0
Es heißt nicht, dass Sie Farben sehen können. Es heißt, dass Sie die nicht druckbaren Zeichen sehen können. Versuchen Sie meinen Befehl wie oben mit "cat -v", um zu sehen, worüber "man watch" spricht. davr vor 14 Jahren 0
OK. Es scheint, dass ich die Tatsache akzeptieren muss, dass es einfach unmöglich ist. Paweł Gościcki vor 14 Jahren 0
Gibt es eine Möglichkeit, das Blinzeln zu unterdrücken, das aus den Zyklen von Lösch- und Druckvorgängen resultiert, ein Verhalten, das im Befehl "watch" nicht vorhanden ist? user001 vor 8 Jahren 0
Sie können die Dauer des Blinzelns ein wenig verringern, indem Sie a) die anzuzeigenden Daten in einer Variablen sammeln, b) den Bildschirm löschen und c) die Variable drucken. Nick Russo vor 7 Jahren 1
@NickRusso danke für den Vorschlag. So etwas reduziert das Flackern erheblich: `während wahr; do out = $ (Datum; echo; ls -al -color); löschen; echo $ out; sleep 2; done` Kevin Mark vor 7 Jahren 1
Berücksichtigen Sie auch, dass die Leitungslänge in das Terminal passt: https://superuser.com/a/58812/114579 nobar vor 7 Jahren 0
@KevinMark: Sie sollten Anführungszeichen verwenden, um mehrere Zeilen zu behandeln: `echo" $ out "`. https://stackoverflow.com/q/2414150/86967 nobar vor 7 Jahren 1
@nobar Du hast recht. Sieht so aus, als müsste es in bash Anführungszeichen geben, nicht zsh. Kevin Mark vor 7 Jahren 0
@KevinMark Sie können den Befehl "clear" in die Klammern setzen. Es wird nur ein Terminalsteuerungscode gedruckt. Siehe auch meine längere Antwort https://superuser.com/a/1270584/21952. user21952-is-a-great-name vor 6 Jahren 0
4
fatuhoku

Wenn Sie einen Mac wie ich watchvon Homebrew verwenden, werden keine Farben unterstützt.

Was Sie wollen, ist fswatch, aber es ist noch kein Homebrew. Um es zu installieren, sollten Sie das etwas mehr komplizierte tun

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

Siehe diese SO-Antwort zur Verwendung.

Dies funktioniert nur für das Dateisystem, während 'watch' für einen Befehl gilt Brice vor 10 Jahren 2
fswatch ist auf Homebrew 0.9.5 verfügbar code_monk vor 10 Jahren 0
3
Dennis Williamson

watchfunktioniert nicht mit der Farbausgabe und ich kenne keine Möglichkeit, dies zu tun. Sie können jedoch ein eigenes Skript erstellen, um es zu emulieren.

1
user21952-is-a-great-name

UPDATE : Stellt sich heraus, dass die neuesten Versionen watchdas Problem behoben haben. Wenn also die Farben watch --colorfalsch sind, ist es wahrscheinlich besser, es einfach zu aktualisieren (auf meinem System ist es im procpsPaket).


Die Farbunterstützung watch --colorist meiner Erfahrung nach begrenzt (wenn auch ausreichend für ls -l --color). Hier ist meine Version von @ davrs Antwort mit einigen zusätzlichen Funktionen, vor allem reduziertem Flimmern. Sie können es in Ihre .bashrc einfügen und es als verwenden 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; } 

Sie können auch Dinge ausprobieren

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

wenn Ihr Terminal weniger Zeilen hat als die Ausgabe. Das funktioniert nur, wenn alle Zeilen kürzer als die Klemmenbreite sind. Die beste Lösung, die ich dafür kenne, ist:

cwatch 'let lines=`tput lines`-2; ls -l --color | head -n $lines'