Couleurs avec la commande unix «watch»?

Réponses:

146

Certaines versions plus récentes de watchprennent désormais en charge la couleur.

Par exemple watch --color ls -ahl --color.

Connexes .

Suspendu jusqu'à nouvel ordre.
la source
3
jetez un oeil à: superuser.com/questions/125469/… (première réponse) - Vous pouvez peut-être le lier dans votre réponse.
aatdark
11
Je suis venu ici pour utiliser watchavec git diff. FWIW, pour obtenir que vous devez travailler passer --color=alwaysà git diff(par exemple watch --color git diff --color=always.
theabraham
30

Ne pas utiliser watch ... Lorsque vous utilisez la montre, les programmes peuvent détecter qu'ils n'écrivent pas sur un terminal, puis supprimer la couleur. Vous devez utiliser des indicateurs de programme spécifiques pour y conserver les codes de contrôle.

Si vous ne connaissez pas les drapeaux ou qu'il n'y en a pas, vous pouvez faire regarder un pauvre en:

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

Il aura un peu de scintillement (la montre fonctionne "double buffered") mais pour certains trucs c'est assez utile.

Vous pourriez être tenté de fabriquer une montre de pauvre à double tampon en utilisant

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

Mais ensuite, vous frapperez à nouveau la fonction "Je n'écris pas sur un terminal".

théiste
la source
Peut-être utiliser à la while sleep <time>; do clear; <command> | tee /tmp/file; doneplace de >et cat?
André Leria
mmm je ne comprends pas @ AndréLeria ... | tee supprimera les codes de couleur comme watchdo et n'empêchera pas la commande de scintiller
theist
C'est une suggestion pour le deuxième exemple, qui ne me donne pas non plus de couleurs. Ou peut-être que je fais quelque chose de mal?
André Leria
1
@ AndréLeria Le deuxième "exemple" est un mauvais exemple (comme il est dit dans la ligne las). Le fait est qu'une fois que vous frappez un tube, vous perdez les codes de couleur car vous n'écrivez pas sur un terminal. Il est là pour montrer à quel point il est faux d'essayer de compenser le scintillement dû au laps de temps entre l'exécution de la commande clear et cible en utilisant un tube pour travailler tamponné commewatch
theist
5
En bash: while sleep <time> ; do x="$( <command> 2>&1 )" ; clear ; echo "$x" ; done- Il n'utilise que les fonctions internes du shell pour effacer l'écran et afficher la sortie, étant donc l'alternative la moins scintillante.
Géza Török
17

Vous pouvez dupliquer l'opération fondamentale et sans fioritures de watchdans quelques lignes de script shell.

$ 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

Finalement, quelqu'un de très intelligent piratera une trcommande dans ce script qui supprime les caractères de contrôle, puis forcera l'utilisateur à utiliser --colorpour désactiver cette logique. Pour le moment, la pure naïveté de cette mise en œuvre éloigne le monstre mangeur de couleurs.

Si vous êtes dans une situation où watchvous n'avez pas l' --coloroption et que vous ne pouvez pas mettre à niveau le package pour une raison quelconque, vous pouvez peut-être le faire.

Kaz
la source
8

Bien que d'autres réponses résolvent ce problème, le moyen le plus simple d'y parvenir est d'utiliser l' unbufferoutil. Pour l'utiliser, faites simplement:

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

De cette façon, vous n'avez pas à rechercher les séquences de contrôle activant les indicateurs de votre programme. La mise en garde cependant est que votre version de la montre doit prendre en charge le --colordrapeau.

Vous pouvez installer un buffer sur Debian ou Ubuntu en utilisant sudo apt-get install expect.

lol
la source
'unbuffer <command>'- sans donner une commande spécifique à utiliser comment cela répond-il à la question?
Danoram du
@Danoram Qu'est-ce qui n'est pas clair pour vous? Avez-vous besoin d'aide pour remplacer <command>par le programme spécifique que vous souhaitez exécuter avec des couleurs?
Avamander
@Avamander J'aurais écrit ce commentaire parce que la question a été signalée. Si vous vérifiez l'historique des modifications, vous verrez que l'auteur a mis à jour la réponse. Rien n'est clair. Mon commentaire n'est tout simplement plus pertinent ..
Danoram
1

À partir du manuel de la montre:

Les caractères non imprimables sont supprimés de la sortie du programme. Utilisez "cat -v" dans le cadre du pipeline de commandes si vous voulez les voir.

Cependant, je ne sais pas comment l'utiliser.

Benoit
la source
5
Cela fait que les caractères de contrôle sont visibles pour moi dans la sortie, plutôt que de provoquer une coloration. Par exemple watch -c "ls --color|cat -v"montre ^[[0m^[[01;34mAgent^[[0mpour la première ligne.
Drew Noakes
1
essayerwatch --color ls --color=always .
Zhang LongQI