comando de relógio bash com cores preservadas

44

De man watch :

Non-printing characters are stripped from program output. Use "cat -v" as part of the command pipeline if you want to see them.

Então, como eu uso o cat -v se eu quiser ver a saída colorida de:

watch ls -al --color
    
por Paweł Gościcki 29.03.2010 / 21:00

5 respostas

48

O comando certo é

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

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

    
por 16.11.2010 / 21:51
25

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ê poderia 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 por que 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ê quer.

    
por 29.03.2010 / 21:25
4

Se você estiver usando um Mac, como eu, o watch do Homebrew 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.

    
por 05.09.2013 / 00:24
3

watch não funciona com saída de cores e não sei como fazer isso. Você pode criar seu próprio script para simulá-lo.

    
por 29.03.2010 / 21:26
1

UPDATE : as últimas versões do watch corrigiram o problema. Então, se as cores de watch --color estão erradas, provavelmente é melhor apenas atualizá-lo (no meu sistema, ele está no pacote procps ).

O suporte de cores em watch --color é limitado em minha experiência (embora seja suficiente para ls -l --color ). Aqui está a minha versão da resposta do @ davr com alguns recursos extras, o mais importante é a redução da tremulação. Você pode colocá-lo em 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 '3[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 menores que a largura do terminal. A melhor solução que eu conheço para isso é:

cwatch 'let lines='tput lines'-2; ls -l --color | head -n $lines'
    
por 21.11.2017 / 22:01