Farben mit Unix-Befehl "watch"?


Antworten:



31

Nicht verwenden watch... Wenn Sie Überwachungsprogramme verwenden, können Sie erkennen, dass sie nicht auf ein Terminal schreiben, und dann die Farbe entfernen. Sie müssen bestimmte Programmflags verwenden, um die Steuercodes dort zu behalten.

Wenn Sie die Flaggen nicht kennen oder nicht, können Sie einen armen Mann dazu bringen, zuzusehen, indem Sie:

while sleep <time>; do clear; <command>; done

Es wird ein bisschen flackern (Uhr funktioniert "doppelt gepuffert"), aber für einige Dinge ist es nützlich genug.

Sie könnten versucht sein, eine doppelt gepufferte Uhr für arme Männer herzustellen

while sleep <time>; do <command> > /tmp/file; clear; cat /tmp/file; done

Aber dann drücken Sie erneut die Funktion "Ich schreibe nicht an ein Terminal".


Vielleicht while sleep <time>; do clear; <command> | tee /tmp/file; doneanstelle von >und verwenden cat?
André Leria

mmm ich verstehe es nicht @ AndréLeria ... | T-Stück entfernt Farbcodes wie watchdo und verhindert nicht das Flackern des Befehls
Theist

Es ist ein Vorschlag für das zweite Beispiel, das mir auch keine Farben gibt. Oder mache ich etwas falsch?
André Leria

1
@ AndréLeria Das zweite "Beispiel" ist ein falsches Beispiel (wie in der Las-Zeile gesagt). Der Punkt ist, dass Sie, sobald Sie eine Pfeife treffen, die Farbcodes verlieren, da Sie nicht in ein Terminal schreiben. Es ist da, um zu zeigen, wie falsch es ist, zu versuchen, das Flimmern aufgrund der Zeitspanne zwischen dem Löschen und der Ausführung des Zielbefehls mit einer Pipe zu kompensieren, um gepuffert zu arbeiten wiewatch
Theist

4
In bash: while sleep <time> ; do x="$( <command> 2>&1 )" ; clear ; echo "$x" ; done- Es werden nur integrierte Shell-Funktionen verwendet, um den Bildschirm zu löschen und die Ausgabe anzuzeigen. Dies ist daher die am wenigsten flackernde Alternative.
Géza Török

18

Sie können die grundlegende, schnörkellose Operation watchin ein paar Zeilen Shell-Skript duplizieren .

$ cat cheapwatch 
#!/bin/sh

# Not quite your Rolex

while true ; do
  clear
  printf "[%s] Output of %s:\n" "$(date)" "$*"
  # "$@" <- we don't want to do it this way, just this:
  ${SHELL-/bin/sh} -c "$*"
  sleep 1  # genuine Quartz movement
done

$ ./cheapwatch ls --color  # no problem

Irgendwann hackt jemand, der sehr klug ist, einen trBefehl in dieses Skript, der die Steuerzeichen entfernt, und zwingt den Benutzer --color, diese Logik zu deaktivieren. Die schiere Naivität dieser Implementierung hält das farbfressende Monster vorerst fern.

Wenn Sie sich in einer Situation befinden, in watchder die --colorOption nicht verfügbar ist und Sie das Paket aus irgendeinem Grund nicht aktualisieren können, können Sie dies möglicherweise einwerfen.



8

Während andere Antworten dieses Problem lösen, ist der einfachste Weg, dies zu erreichen, die Verwendung des unbufferTools. Um es zu benutzen, machen Sie einfach:

$ watch --color 'unbuffer <your-program>'

Auf diese Weise müssen Sie nicht nach Kontrollsequenzen suchen, die Flags Ihres Programms aktivieren. Die Einschränkung ist jedoch, dass Ihre Version der Uhr die --colorFlagge unterstützen sollte.

Sie können Unbuffer unter Debian oder Ubuntu mit installieren sudo apt-get install expect.


'unbuffer <command>'- ohne einen bestimmten Befehl zu geben, wie verwendet dies die Frage?
Danoram

@ Danoram Was ist für dich unklar? Benötigen Sie Hilfe beim Ersetzen <command>durch das spezifische Programm, das Sie mit Farben ausführen möchten?
Avamander

@ Avamander Ich hätte diesen Kommentar geschrieben, weil die Frage markiert war. Wenn Sie den Bearbeitungsverlauf überprüfen, wird die Antwort vom Autor aktualisiert. Nichts ist unklar. Mein Kommentar ist einfach nicht mehr relevant.
Danoram

1

Aus dem Handbuch der Uhr:

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

Ich bin mir jedoch nicht sicher, wie ich es verwenden soll.


5
Dies führt dazu, dass die Steuerzeichen in der Ausgabe für mich sichtbar sind, anstatt eine Färbung zu verursachen. Zum Beispiel watch -c "ls --color|cat -v"zeigt ^[[0m^[[01;34mAgent^[[0mfür die erste Zeile.
Drew Noakes

1
versuchenwatch --color ls --color=always .
Zhang LongQI
Durch die Nutzung unserer Website bestätigen Sie, dass Sie unsere Cookie-Richtlinie und Datenschutzrichtlinie gelesen und verstanden haben.
Licensed under cc by-sa 3.0 with attribution required.