Alternative à regarder qui prend en charge les couleurs

12

J'ai une commande ( phpunit) qui a une sortie colorée. Selon la watchcommande, je devrais pouvoir utiliser l' --colorindicateur pour permettre le rendu des couleurs. Cependant, cela ne fonctionne pas. Existe-t-il d'autres moyens de résoudre ce problème?

netbrain
la source
5
Êtes-vous sûr que ce n'est pas la commande qui ne produit pas de couleurs lorsque stdout n'est pas un terminal? Essayezphpunit | cat
enzotib
1
Bien que @enzotib ait probablement raison, un script BASH pourrait de toute façon être utilisé comme solution de contournement .
sr_
phpunit | catn'a pas fonctionné malheureusement. Cependant, l'approche du script bash a très bien fonctionné. Merci!
netbrain
2
@netbrain: comme on le suppose, le fait que phpunit | catne fonctionnent pas est un symptôme que le problème est phpunitet non watch.
enzotib
1
Sur certains Unix communs (tels que Snow Leopard), --colorn'est pas un indicateur valide pour watch.
Stefan Lasiewski

Réponses:

3

phpunit | catn'a pas fonctionné (signalant que ce n'est pas un problème avec watchla phpunit commande).

Comme alternative, l'approche de script bash suivante a très bien fonctionné pour moi:

#!/bin/bash
while true; do
    (echo -en '\033[H'
        CMD="$@"
        bash -c "$CMD" | while read LINE; do 
            echo -n "$LINE"
            echo -e '\033[0K' 
        done
        echo -en '\033[J') | tac | tac 
    sleep 2 
done

Usage:

$ botch my-command
netbrain
la source
6
Veuillez mettre à jour votre réponse avec plus de détails. En l'état, si les commentaires sur votre question sont supprimés, ce n'est pas très utile. Incluez au moins le lien vers le script que vous utilisez, ou mieux: tout ce que vous avez fini par faire exactement, cela peut aider les futurs visiteurs si ce lien disparaît.
Mat
@netbrain phpunit | catn'était pas non plus censé fonctionner. C'était censé être un test pour prouver qu'il watchne supprimait pas les couleurs, mais ne les phpunitémettait pas quand il a remarqué que STDOUT n'était pas un ATS.
Patrick
phpunit --colors=always produit une sortie couleur lorsqu'il n'est pas directement connecté à un terminal.
simohe
0

Voici mon implémentation, c'est un script bash mais il est très facile de le convertir en fonction (pour changer 'exit' en 'return')

#!/bin/bash

trap ctrl_c INT

function ctrl_c()
{
    echo -en "\033[?7h" #Enable line wrap
    echo -e "\033[?25h" #Enable cursor
    exit 0
}

function print_usage()
{
    echo
    echo '  Usage: cwatch [sleep time] "command"'
    echo '  Example: cwatch "ls -la"'
    echo
}

if [ $# -eq 0 ] || [ $# -gt 2 ]
then
    print_usage
    exit 1
fi

SLEEPTIME=1
if [ $# -eq 2 ]
then
    SLEEPTIME=${1}
    if [[ $SLEEPTIME = *[[:digit:]]* ]]
    then
        shift
    else
        print_usage
        exit 1
    fi
fi

CMD="${1}"
echo -en "\033[?7l" #Disable line wrap
echo -en "\033[?25l" #Disable cursor
while (true)
do

    (echo -en "\033[H" #Sets the cursor position where subsequent text will begin
    echo -e "Every ${SLEEPTIME},0s: '\033[1;36m${CMD}\033[0m'\033[0K"
    echo -e "\033[0K" #Erases from the current cursor position to the end of the current line
    BASH_ENV=~/.bashrc bash -O expand_aliases -c "${CMD}" | while IFS='' read -r LINE 
    do
        echo -n "${LINE}"
        echo -e "\033[0K" #Erases from the current cursor position to the end of the current line
    done
    #echo -en "\033[J") | tac | tac #Erases the screen from the current line down to the bottom of the screen
    echo -en "\033[J") #Erases the screen from the current line down to the bottom of the screen
    sleep ${SLEEPTIME}
done
Alejandro Besada Juez
la source