comando bash watch con colores preservados

56

De man watch:

Los caracteres que no se imprimen se eliminan de la salida del programa. Use "cat -v" como parte de la canalización de comandos si desea verlos.

Entonces, ¿cómo lo uso cat -vsi quiero ver la salida en color de:

watch ls -al --color
Paweł Gościcki
fuente

Respuestas:

61

El comando correcto es

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

No está documentado en la página de manual o en la pantalla de ayuda. Tengo que usar cadenas para encontrarlo.

caballo de papel
fuente
@ PawełGościcki Nevermind, ya lo encontré en gitorious, aunque no pude hacerlo funcionar con phpunit.
Ikke
1
Mi reloj es v0.3.0 y estoy en Ubuntu 10.0
Paweł Gościcki
2
También tengo la versión 0.3.0 y para "ls --color" simple, el comando watch funcionará, pero por alguna razón los escenarios más complejos no: watch --color "sudo iwlist wlan0 scanning | egrep 'Quality|ESSID' | egrep --color -i 'foobar|$'"comerán los colores :(
matemáticas
@math: intente intercambiar sus comillas simples y dobles.
Dennis Williamson
El watchde procps (el valor por defecto en la mayoría de distribuciones de Linux, creo) tiene una --coloropción ya V3.3.2.
sleske
27

Creo que puede no ser posible con el comando 'watch'. Aquí hay una forma más larga de hacerlo:

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

Podría poner esto en un script, por ejemplo:

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

Para aclarar, he aquí por qué creo que no es posible con el comando 'watch'. Vea lo que sucede si usa cat -v:

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

Te muestra los caracteres de control de color ... que creo que no es lo que quieres.

davr
fuente
man watchsugiere claramente que debería ser posible sin disimular watch.
Paweł Gościcki
No dice que podrás ver los colores. Dice que podrá ver los caracteres no imprimibles. Pruebe mi comando como arriba con cat -vpara ver de qué man watchestaba hablando.
davr
1
Puede reducir un poco la duración del parpadeo a) recopilando los datos que se mostrarán en una variable, b) limpiando la pantalla, c) imprimiendo la variable.
Nick Russo
1
@NickRusso gracias por la sugerencia. Algo así reduce en gran medida el parpadeo:while true; do out=$(date;echo;ls -al --color);clear;echo $out;sleep 2;done
Kevin Mark
1
@KevinMark: Debe usar comillas para manejar múltiples líneas: echo "$out". stackoverflow.com/q/2414150/86967
nobar
6

Si está utilizando una Mac, como yo, watchde Homebrew no es compatible con el color.

Lo que quieres es fswatch pero aún no es Homebrew. Para instalarlo, querrás hacer un poco más complicado

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

Vea esta respuesta SO para su uso.

fatuhoku
fuente
2
Esto solo funciona para el sistema de archivos, mientras que se watchaplica a un comando
Brice
fswatch está disponible en Homebrew 0.9.5
code_monk
1

ACTUALIZACIÓN : Resulta las últimas versiones de watchsolucionado el problema. Entonces, si los colores watch --colorson incorrectos, probablemente sea mejor simplemente actualizarlo (en mi sistema, está en el procpspaquete).


El soporte de color watch --colores limitado en mi experiencia (aunque suficiente para ls -l --color). Aquí está mi versión de la respuesta de @ davr con algunas características adicionales, el parpadeo más importante reducido. Puede ponerlo en su .bashrc y usarlo 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;
}

También puedes probar cosas como

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

si su terminal tiene menos líneas que la salida. Sin embargo, eso solo funciona si todas las líneas son más cortas que el ancho del terminal. La mejor solución que conozco para eso es:

cwatch 'let lines=`tput lines`-2; ls -l --color | head -n $lines'
user21952-es-un-gran-nombre
fuente