commande de montre bash avec les couleurs préservées

57

De man watch:

Les caractères non imprimables sont supprimés de la sortie du programme. Utilisez "cat -v" dans le cadre du pipeline de commandes si vous souhaitez les voir.

Alors, comment puis-je utiliser cat -vsi je veux voir la sortie colorée de:

watch ls -al --color
Paweł Gościcki
la source

Réponses:

63

La bonne commande est

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

Cela n'est pas documenté dans la page de manuel ou l'écran --help. Je dois utiliser des chaînes pour le trouver.

cheval de papier
la source
@ PawełGościcki Nevermind, déjà trouvé sur gitorious, bien que, ne puisse pas le faire fonctionner avec phpunit.
Ikke
1
Ma montre est v0.3.0 et je suis sur Ubuntu 10.0
Paweł Gościcki le
2
J'ai aussi la version 0.3.0 et pour "ls --color" simple, la commande watch fonctionnera mais pour une raison quelconque, des scénarios plus complexes ne le feront pas: watch --color "sudo iwlist wlan0 scanning | egrep 'Quality|ESSID' | egrep --color -i 'foobar|$'"mangera les couleurs :(
math
@math: Essayez d'échanger vos guillemets simples et doubles.
Dennis Williamson
Le watchfrom procps (le défaut sur la plupart des distributions Linux, je crois) a une --coloroption depuis la V3.3.2.
Sleske
27

Je pense que cela peut ne pas être possible avec la commande 'watch'. Voici un moyen plus long de le faire:

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

Vous pouvez mettre ceci dans un script, par exemple:

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

Pour clarifier, voici pourquoi je pense que ce n'est pas possible avec la commande 'watch'. Voyez ce qui se passe si vous utilisez cat -v:

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

Il vous montre les caractères de contrôle de la couleur ... ce qui, à mon avis, n’est pas ce que vous voulez.

davr
la source
man watchsuggère clairement que cela devrait être possible sans dissing watch.
Paweł Gościcki
Il ne dit pas que vous pourrez voir les couleurs. Il dit que vous pourrez voir les caractères non imprimables. Essayez ma commande comme ci-dessus avec cat -vpour voir ce qui man watchétait en train de parler.
davr
1
Vous pouvez réduire un peu la durée du clignotement: a) en collectant les données à afficher dans une variable, b) en effaçant l'écran, c) en imprimant la variable.
Nick Russo
1
@ NickRusso merci pour la suggestion. Quelque chose comme ça réduit grandement le scintillement:while true; do out=$(date;echo;ls -al --color);clear;echo $out;sleep 2;done
Kevin Mark
1
@KevinMark: Vous devez utiliser des guillemets pour gérer plusieurs lignes: echo "$out". stackoverflow.com/q/2414150/86967
nobar
6

Si vous utilisez un Mac, comme moi, watchHomebrew ne prend pas en charge la couleur.

Ce que vous voulez, c'est fswatch, mais ce n’est pas encore Homebrew. Pour l'installer, vous aurez envie de faire le légèrement plus compliqué

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

Voir cette réponse SO pour l'utilisation.

Fatuhoku
la source
2
Cela ne fonctionne que pour le système de fichiers, alors que cela watchs'applique à une commande
Brice
fswatch est disponible sur Homebrew 0.9.5
code_monk
1

UPDATE : Les dernières versions de watchrésolu le problème. Donc, si les couleurs de watch --colorsont fausses, il vaut probablement mieux simplement les mettre à jour (sur mon système, elles sont dans le procpspaquet).


La prise en charge de la couleur watch --colorest limitée dans mon expérience (bien que suffisante pour ls -l --color). Voici ma version de la réponse de @ davr avec quelques fonctionnalités supplémentaires, le plus important étant la réduction du scintillement. Vous pouvez le mettre dans votre .bashrc et l'utiliser comme 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;
}

Vous pouvez aussi essayer des choses comme

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

si votre terminal a moins de lignes que la sortie. Cela ne fonctionne que si toutes les lignes sont plus courtes que la largeur du terminal. La meilleure solution que je connaisse pour cela est la suivante:

cwatch 'let lines=`tput lines`-2; ls -l --color | head -n $lines'
utilisateur21952-est-un-grand-nom
la source