Cores com comando unix “assistir”?

Respostas:

145

Algumas versões mais recentes watchagora oferecem suporte a cores.

Por exemplo watch --color ls -ahl --color.

Relacionado .

Pausado até novo aviso.
fonte
3
dê uma olhada em: superuser.com/questions/125469/… (primeira resposta) - Talvez você possa incluir um link em sua resposta.
aatdark
11
Eu vim aqui para usar watchcom git diff. FWIW, para chegar a esse trabalho que você tem que passar --color=alwayspara git diff(ex watch --color git diff --color=always.
theabraham
31

Não use watch... Quando você usa o relógio, os programas podem detectar que não estão gravando em um terminal e remover a cor. Você deve usar sinalizadores de programa específicos para manter os códigos de controle lá.

Se você não conhece as bandeiras ou não há, você pode fazer um homem pobre vigiar:

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

Ele vai piscar um pouco (o relógio funciona com "buffer duplo"), mas para algumas coisas é útil o suficiente.

Você pode ficar tentado a fazer um relógio de pobre com proteção dupla usando

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

Mas então você atingirá novamente o recurso "Não estou escrevendo para um terminal".

teísta
fonte
Talvez use em while sleep <time>; do clear; <command> | tee /tmp/file; donevez de >e cat?
André Leria
mmm Não entendi @ AndréLeria ... | tee irá remover códigos de cores como watchdo e não impede que o comando pisque
teísta
É uma sugestão para o segundo exemplo, que também não me dá cores. Ou talvez eu esteja fazendo algo errado?
André Leria
1
@ AndréLeria O segundo "exemplo" é um exemplo errado (como está dito na última linha). A questão é que, uma vez que você atinge um tubo, você perde os códigos de cores, pois não está escrevendo para um terminal. Ele está lá para mostrar o quão errado é tentar compensar a cintilação devido ao lapso de tempo entre a execução do comando claro e alvo usando um pipe para trabalhar em buffer comowatch
teísta
4
No bash: while sleep <time> ; do x="$( <command> 2>&1 )" ; clear ; echo "$x" ; done- Ele usa apenas shell embutidos para limpar a tela e exibir a saída, sendo, portanto, a alternativa com menos oscilações.
Géza Török
18

Você pode duplicar a operação básica e simples de watchem algumas linhas de script de 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

Eventualmente, alguém muito inteligente irá hackear um trcomando neste script que retira os caracteres de controle e então forçar o usuário a usar --colorpara desativar essa lógica. Por enquanto, a pura ingenuidade dessa implementação está mantendo o monstro comedor de cores à distância.

Se você estiver em uma situação em watchque não tem a --coloropção e não pode atualizar o pacote por qualquer motivo, talvez você possa jogar isso.

Kaz
fonte
8

Embora outras respostas resolvam esse problema, a maneira mais fácil de fazer isso é usando a unbufferferramenta. Para usá-lo, basta fazer:

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

Dessa forma, você não precisa procurar por sinalizadores de ativação de sequência de controle de seu programa. A ressalva, entretanto, é que sua versão do relógio deve suportar a --colorbandeira.

Você pode instalar o unbuffer no Debian ou Ubuntu usando sudo apt-get install expect.

ri muito
fonte
'unbuffer <command>'- sem dar um comando específico para usar, como isso responde à pergunta?
Danoram
@Danoram O que não está claro para você? Você precisa de ajuda para substituir <command>o programa específico que deseja executar com cores?
Avamander
@Avamander Eu teria escrito esse comentário porque a pergunta foi sinalizada. Se você verificar o histórico de edição, verá que o autor atualizou a resposta. Nada está claro. Meu comentário simplesmente não é mais relevante ..
Danoram
1

Do manual do relógio:

Os caracteres não imprimíveis são retirados da saída do programa. Use "cat -v" como parte do pipeline de comando se quiser vê-los.

Porém, não tenho certeza de como usá-lo.

Benoit
fonte
5
Isso faz com que os caracteres de controle fiquem visíveis na saída para mim, em vez de causar coloração. Por exemplo, watch -c "ls --color|cat -v"mostra ^[[0m^[[01;34mAgent^[[0mpara a primeira linha.
Drew Noakes de
1
tentativawatch --color ls --color=always .
Zhang LongQI