Kolory z poleceniem „obserwuj” w systemie unix?


Odpowiedzi:



30

Nie używaj watch... Kiedy używasz zegarka, programy mogą wykryć, że nie piszą do terminala, a następnie usuwają kolor. Musisz użyć określonych flag programu, aby zachować tam kody sterujące.

Jeśli nie znasz flag lub ich nie ma, możesz sprawić, by człowiek biedny patrzył:

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

Będzie miał trochę migotania (zegarek działa „podwójnie buforowany”), ale do niektórych rzeczy jest wystarczający.

Możesz pokusić się o zrobienie zegarka z podwójnym buforowaniem dla biednych ludzi

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

Ale wtedy ponownie klikniesz opcję „Nie piszę do terminala”.


Może użyć while sleep <time>; do clear; <command> | tee /tmp/file; donezamiast >i cat?
André Leria

mmm, nie rozumiem tego @ AndréLeria ... | tee usunie kody kolorów, tak jak watchdo, i nie zapobiega migotaniu poleceń
teista

To propozycja na drugi przykład, który również nie daje mi kolorów. A może robię coś źle?
André Leria

1
@ AndréLeria Drugi „przykład” jest złym przykładem (jak powiedziano w ostatniej linii). Chodzi o to, że po trafieniu w rurkę tracisz kody kolorów, ponieważ nie piszesz do terminala. Jest po to, aby pokazać, jak źle jest próbować skompensować migotanie z powodu upływu czasu między wykonaniem polecenia wyczyść a docelowym za pomocą potoku do pracy buforowanej jakwatch
teista

5
W bash: while sleep <time> ; do x="$( <command> 2>&1 )" ; clear ; echo "$x" ; done- Używa tylko wbudowanych poleceń powłoki, aby wyczyścić ekran i wyświetlić dane wyjściowe, dlatego jest najmniej migoczącą alternatywą.
Géza Török

17

Możesz powielić podstawowe, proste działanie watchw kilku liniach skryptu powłoki.

$ 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

W końcu ktoś bardzo sprytny włamie trpolecenie do tego skryptu, który usuwa znaki kontrolne, a następnie zmusi użytkownika --colordo wyłączenia tej logiki. Na razie czysta naiwność tej implementacji powstrzymuje pożerającego kolory potwora.

Jeśli jesteś w sytuacji, w której watchnie masz --coloropcji i nie możesz zaktualizować pakietu z jakiegokolwiek powodu, może możesz to dorzucić.



8

Podczas gdy inne odpowiedzi rozwiązują ten problem, najłatwiejszym sposobem osiągnięcia tego jest użycie unbuffernarzędzia. Aby go użyć, po prostu wykonaj:

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

W ten sposób nie musisz szukać sekwencji sterującej włączającej flagi programu. Zastrzeżenie jest jednak takie, że Twoja wersja zegarka powinna obsługiwać --colorflagę.

Możesz zainstalować unbuffer na Debianie lub Ubuntu za pomocą sudo apt-get install expect.


'unbuffer <command>'- bez wydawania konkretnego polecenia, jak to odpowiada na pytanie?
Danoram

@Danoram Co jest dla Ciebie niejasne? Czy potrzebujesz pomocy w zamianie <command>konkretnego programu, który chcesz uruchomić z kolorami?
Avamander

@Avamander Napisałbym ten komentarz, ponieważ pytanie zostało oflagowane. Jeśli sprawdzisz historię zmian, zobaczysz, że autor zaktualizował odpowiedź. Nic nie jest niejasne. Mój komentarz już nie ma znaczenia ...
Danoram,

1

Z instrukcji zegarka:

Znaki niedrukowalne są usuwane z wyjścia programu. Użyj "cat -v" jako części potoku poleceń, jeśli chcesz je zobaczyć.

Chociaż nie jestem pewien, jak go używać.


5
Powoduje to, że znaki sterujące są dla mnie widoczne na wyjściu, zamiast powodować przebarwienia. Na przykład watch -c "ls --color|cat -v"pokazuje ^[[0m^[[01;34mAgent^[[0mdla pierwszej linii.
Drew Noakes,

1
spróbujwatch --color ls --color=always .
Zhang LongQI
Korzystając z naszej strony potwierdzasz, że przeczytałeś(-aś) i rozumiesz nasze zasady używania plików cookie i zasady ochrony prywatności.
Licensed under cc by-sa 3.0 with attribution required.