Bash-Watch-Befehl mit beibehaltenen Farben

57

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 Farbausgabe von sehen möchte:

watch ls -al --color
Paweł Gościcki
quelle

Antworten:

63

Der richtige Befehl ist

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

Es ist nicht in der Manpage oder im --help-Bildschirm dokumentiert. Ich muss Zeichenfolgen verwenden, um es zu finden.

Papierpferd
quelle
@PawełGościcki Nevermind, fand es schon auf gitorious, konnte es aber nicht mit phpunit zum Laufen bringen.
Ikke
1
Meine Uhr ist v0.3.0 und ich bin auf Ubuntu 10.0
Paweł Gościcki
2
Ich habe auch Version 0.3.0 und für einfache "ls - color" wird der Befehl watch funktionieren, aber aus irgendeinem Grund komplexere Szenarien nicht: watch --color "sudo iwlist wlan0 scanning | egrep 'Quality|ESSID' | egrep --color -i 'foobar|$'"die Farben essen :(
math
@math: Tauschen Sie die einfachen und doppelten Anführungszeichen aus.
Dennis Williamson
Die watchOption from procps (die Standardeinstellung in den meisten Linux-Distributionen, glaube ich) gibt es --colorseit V3.3.2.
Sleske
27

Ich denke, mit dem Befehl 'watch' ist dies möglicherweise nicht möglich. Hier ist ein längerer Weg, dies zu tun:

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

Sie könnten dies in ein Skript einfügen, zum Beispiel:

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

Um dies zu verdeutlichen, hier ist der Grund, warum ich denke, dass es 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 dir die Farbkontrollzeichen ... was meiner Meinung nach nicht das ist, was du willst.

davr
quelle
man watchdeutet klar darauf hin, dass es ohne Dissens möglich sein sollte watch.
Paweł Gościcki
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, um cat -vzu sehen, worüber gesprochen man watchwurde.
Davr
1
Sie können die Dauer des Blinkens ein wenig verkürzen, indem Sie a) die anzuzeigenden Daten in einer Variablen sammeln, b) den Bildschirm löschen, c) die Variable drucken.
Nick Russo
1
@ NickRusso danke für den Vorschlag. So etwas reduziert das Flackern erheblich:while true; do out=$(date;echo;ls -al --color);clear;echo $out;sleep 2;done
Kevin Mark
1
@KevinMark: Sie sollten Anführungszeichen verwenden , um mehrere Zeilen zu behandeln: echo "$out". stackoverflow.com/q/2414150/86967
nobar
6

Wenn Sie einen Mac verwenden, wie ich, unterstützt watchHomebrew keine Farben.

Was Sie wollen, ist fswatch, aber es ist noch nicht Homebrew. Um es zu installieren, möchten Sie das etwas gewundenere tun

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

Siehe diese SO-Antwort zur Verwendung.

Fatuhoku
quelle
2
Dies funktioniert nur für das Dateisystem, während watchfür einen Befehl gilt
Brice
fswatch ist verfügbar auf Homebrew 0.9.5
code_monk 20.10.14
1

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


Die Farbunterstützung watch --colorist meiner Erfahrung nach begrenzt (obwohl 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 als .bashrc 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 wie versuchen

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

Wenn Ihr Terminal weniger Leitungen als der Ausgang hat. Dies funktioniert jedoch 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'
user21952-is-a-great-name
quelle