comando bash watch com cores preservadas


57

De man watch:

Caracteres não imprimíveis são removidos da saída do programa. Use "cat -v" como parte do pipeline de comandos, se quiser vê-los.

Então, como usar cat -vse eu quiser ver a saída colorida de:

watch ls -al --color

Respostas:


63

O comando certo é

watch --color "ls -a1 --color"

Não está documentado na página do manual ou na tela --help. Eu tenho que usar cordas para encontrá-lo.


@ PawełGościcki Nevermind, já o encontrou no Gitorious, embora não conseguisse fazê-lo funcionar com o phpunit.
Ikke

1
Meu relógio é v0.3.0 e estou no Ubuntu 10.0
Paweł Gościcki

2
Eu também tenho a versão 0.3.0 e para simples "ls --color" o comando relógio irá funcionar, mas por algum motivo cenários mais complexos não: watch --color "sudo iwlist wlan0 scanning | egrep 'Quality|ESSID' | egrep --color -i 'foobar|$'"vai comer as cores :(
matemática

@math: tente trocar suas aspas simples e duplas.
Dennis Williamson

O watchfrom procps (o padrão na maioria das distribuições Linux, acredito) tem uma --coloropção desde a V3.3.2.
Sleske #

27

Eu acho que pode não ser possível com o comando 'watch'. Aqui está uma maneira mais longa de fazer isso:

while true; do clear; date;echo;ls -al --color; sleep 2; done

Você pode colocar isso em um script, por exemplo:

echo "while true; do clear; date;echo;\$*;sleep 2; done" > watch2
chmod +x watch2
./watch2 ls -al --color

Para esclarecer, eis porque eu acho que não é possível com o comando 'watch'. Veja o que acontece se você usar cat -v:

watch "ls -al --color|cat -v"

Ele mostra os caracteres de controle de cores ... o que eu acho que não é o que você deseja.


man watchsugere claramente que isso deve ser possível sem discordar watch.
Paweł Gościcki 29/03/10

Não diz que você poderá ver cores. Diz que você poderá ver os caracteres não imprimíveis. Tente meu comando como acima cat -vpara ver o que man watchestava falando.
davr

1
Você pode reduzir um pouco a duração do piscar de olhos a) coletando os dados a serem exibidos em uma variável, b) limpando a tela, c) imprimindo a variável.
Nick Russo

1
@NickRusso obrigado pela sugestão. Algo como isso reduz muito a cintilação:while true; do out=$(date;echo;ls -al --color);clear;echo $out;sleep 2;done
Kevin Mark

1
@KevinMark: Você deve usar aspas para lidar com várias linhas: echo "$out". stackoverflow.com/q/2414150/86967
nobar

6

Se você estiver usando um Mac, como eu, o watchHomebrew não suporta cores.

O que você quer é fswatch, mas ainda não é o Homebrew. Para instalá-lo, você vai querer fazer um pouco mais complicado

https://raw.github.com/mlevin2/homebrew/116b43eaef08d89054c2f43579113b37b4a2abd3‌​/Library/Formula/fswatch.rb

Veja esta resposta SO para uso.


2
Isso funciona apenas para o sistema de arquivos, enquanto watchse aplica a um comando
Brice

fswatch está disponível no Homebrew 0.9.5
code_monk

1

UPDATE : Acontece que as versões mais recentes do watchproblema foram corrigidas. Portanto, se as cores de watch --colorestão erradas, provavelmente é melhor atualizá-lo (no meu sistema, está no procpspacote).


O suporte de cores watch --coloré limitado em minha experiência (embora suficiente para ls -l --color). Aqui está a minha versão da resposta do @ davr com alguns recursos extras, o mais importante é o flicker reduzido. Você pode colocá-lo no seu .bashrc e usá-lo como cwatch ls -l --color.

# `refresh cmd` executes clears the terminal and prints
# the output of `cmd` in it.
function refresh {
  tput clear || exit 2; # Clear screen. Almost same as echo -en '\033[2J';
  bash -ic "$@";
}

# Like watch, but with color
function cwatch {
   while true; do
     CMD="$@";
     # Cache output to prevent flicker. Assigning to variable
     # also removes trailing newline.
     output=`refresh "$CMD"`;
     # Exit if ^C was pressed while command was executing or there was an error.
     exitcode=$?; [ $exitcode -ne 0 ] && exit $exitcode
     printf '%s' "$output";  # Almost the same as echo $output
     sleep 1;
   done;
}

Você também pode tentar coisas como

cwatch 'ls -l --color | head -n `tput lines`'

se o seu terminal tiver menos linhas que a saída. Isso só funciona se todas as linhas forem mais curtas que a largura do terminal. A melhor solução que conheço é:

cwatch 'let lines=`tput lines`-2; ls -l --color | head -n $lines'
Ao utilizar nosso site, você reconhece que leu e compreendeu nossa Política de Cookies e nossa Política de Privacidade.
Licensed under cc by-sa 3.0 with attribution required.