Colori con comando unix "watch"?


Risposte:



30

Non usare watch... Quando si utilizza watch, i programmi possono rilevare che non stanno scrivendo su un terminale e quindi rimuovere il colore. È necessario utilizzare flag di programma specifici per mantenere i codici di controllo lì.

Se non conosci le bandiere o non ci sono puoi fare in modo che un povero guardi:

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

Avrà un po 'di sfarfallio (l'orologio funziona in "doppio buffer") ma per alcune cose è abbastanza utile.

Potresti essere tentato di fare un orologio per poveri con doppio buffer usando

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

Ma poi premerai di nuovo la funzione "Non sto scrivendo su un terminale".


Forse usare al while sleep <time>; do clear; <command> | tee /tmp/file; doneposto di >e cat?
André Leria

mmm Non capisco @ AndréLeria ... | tee rimuoverà i codici colore come watchfare e non impedisce lo sfarfallio del comando
teista

È un suggerimento per il secondo esempio, che inoltre non mi da i colori. O forse sto facendo qualcosa di sbagliato?
André Leria

1
@ AndréLeria Il secondo "esempio" è un esempio sbagliato (come si dice nella riga las). Il punto è che una volta che colpisci un tubo perdi i codici colore poiché non stai scrivendo su un terminale. È lì per mostrare quanto sia sbagliato cercare di compensare lo sfarfallio dovuto al lasso di tempo tra l'esecuzione del comando chiaro e target utilizzando un tubo per funzionare tamponato comewatch
teista

5
In bash: while sleep <time> ; do x="$( <command> 2>&1 )" ; clear ; echo "$x" ; done- Utilizza solo i builtin della shell per cancellare lo schermo e visualizzare l'output, essendo quindi l'alternativa meno tremolante.
Géza Török

17

Puoi duplicare l'operazione fondamentale e senza fronzoli di watchin un paio di righe di script di 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

Alla fine, qualcuno molto intelligente hackererà un trcomando in questo script che rimuove i caratteri di controllo e quindi costringerà l'utente a utilizzare --colorper disabilitare quella logica. Per il momento, l'assoluta ingenuità di questa implementazione sta tenendo lontano il mostro mangia-colori.

Se ti trovi in ​​una situazione in cui watchnon hai l' --coloropzione e non puoi aggiornare il pacchetto per qualsiasi motivo, forse puoi lanciarlo.



8

Mentre altre risposte risolvono questo problema, il modo più semplice per farlo è utilizzare lo unbufferstrumento. Per usarlo basta fare:

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

In questo modo non devi cercare la sequenza di controllo che abilita i flag del tuo programma. L'avvertenza, tuttavia, è che la tua versione dell'orologio dovrebbe supportare la --colorbandiera.

Puoi installare unbuffer su Debian o Ubuntu usando sudo apt-get install expect.


'unbuffer <command>'- senza dare un comando specifico da usare come risponde alla domanda?
Danoram

@Danoram Cosa non ti è chiaro? Hai bisogno di aiuto per la sostituzione <command>con il programma specifico che desideri eseguire con i colori?
Avamander

@Avamander avrei scritto quel commento perché la domanda è stata contrassegnata. Se controlli la cronologia delle modifiche vedrai che l'autore ha aggiornato la risposta. Niente è chiaro. Il mio commento non è più pertinente ..
Danoram

1

Dal manuale dell'orologio:

I caratteri non stampabili vengono rimossi dall'output del programma. Usa "cat -v" come parte della pipeline dei comandi se vuoi vederli.

Tuttavia, non sono sicuro di come usarlo.


5
Questo fa sì che i caratteri di controllo siano visibili nell'output per me, piuttosto che causare la colorazione. Ad esempio watch -c "ls --color|cat -v"mostra ^[[0m^[[01;34mAgent^[[0mper la prima riga.
Drew Noakes

1
provarewatch --color ls --color=always .
Zhang LongQI
Utilizzando il nostro sito, riconosci di aver letto e compreso le nostre Informativa sui cookie e Informativa sulla privacy.
Licensed under cc by-sa 3.0 with attribution required.