90 votes

commande bash watch avec couleurs préservées

De man watch :

Les caractères non imprimés sont supprimés de la sortie du programme. Utilisez "cat -v" comme de la chaîne de commande si vous vous voulez les voir.

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

watch ls -al --color

101voto

paperhorse Points 1054

La bonne commande est

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

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

33voto

kevin9794 Points 4062

Je pense que ce n'est pas possible avec la commande 'watch'. Voici une façon plus longue de le faire :

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

Vous pourriez mettre cela 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'. Regardez 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, je pense, n'est pas ce que vous voulez.

8voto

fatuhoku Points 242

Si vous utilisez un Mac, comme moi, watch de Homebrew ne supporte pas la couleur.

Ce que vous voulez, c'est fswatch mais ce n'est pas encore Homebrew. Pour l'installer, vous devrez suivre la procédure un peu plus compliquée suivante

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

参照 cette réponse SO pour l'utilisation.

3voto

wasker Points 837

UPDATE : Il s'avère que les dernières versions de watch a réglé le problème. Donc, si les couleurs de watch --color sont erronées, il est probablement préférable de simplement les mettre à jour (sur mon système, elles se trouvent dans le répertoire procps paquet).


Le support des couleurs dans watch --color est 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, la plus importante étant la réduction du scintillement. Vous pouvez la mettre dans votre .bashrc et l'utiliser en tant que 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, cependant. La meilleure solution que je connaisse pour cela est la suivante :

cwatch 'let lines=`tput lines`-2; ls -l --color | head -n $lines'

SistemesEz.com

SystemesEZ est une communauté de sysadmins où vous pouvez résoudre vos problèmes et vos doutes. Vous pouvez consulter les questions des autres sysadmins, poser vos propres questions ou résoudre celles des autres.

Powered by:

X