Alternativa para assistir quais cores de suporte

12

Eu tenho um comando ( phpunit) que tem uma saída colorida. De acordo com o watchcomando, eu devo poder usar o --colorsinalizador para permitir a passagem da renderização de cores. No entanto, isso não está funcionando. Existem outras maneiras de resolver isso?

netbrain
fonte
5
Tem certeza de que esse não é o comando que não produz cores quando stdout não é um terminal? Tentephpunit | cat
enzotib
1
Embora o @enzotib provavelmente esteja certo, um script BASH pode ser usado como solução alternativa .
sr_ 5/03/12
phpunit | catinfelizmente não funcionou. No entanto, a abordagem do script bash funcionou muito bem. Obrigado!
Netbrain
2
@ netbrain: como se supõe, o fato de phpunit | catnão funcionar é um sintoma de que o problema está dentro phpunite não está watch.
enzotib 6/03/12
1
Em alguns Unixes comuns (como o Snow Leopard), --colornão é um sinalizador válido para watch.
Stefan Lasiewski

Respostas:

3

phpunit | catnão funcionou (sinalizando que isso não é um problema, watchmas o phpunit comando).

Como alternativa, a seguinte abordagem de script bash funcionou muito bem para mim:

#!/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

Uso:

$ botch my-command
netbrain
fonte
6
Atualize sua resposta com mais detalhes. Sendo assim, se os comentários sobre sua pergunta forem removidos, isso não será muito útil. Inclua pelo menos o link para o script que você está usando, ou melhor: o que você acabou fazendo exatamente para ajudar os futuros visitantes se esse link ficar inoperante.
Mat
@netbrain também phpunit | catnão deveria funcionar. Deveria ser um teste para provar que watchnão estava removendo as cores, mas não as phpunitestava exibindo quando percebeu que STDOUT não era um TTY.
Patrick
phpunit --colors=always produz saída em cores quando não está diretamente conectado a um terminal.
precisa
0

Aqui minha implementação, é um script bash, mas é muito fácil convertê-lo para funcionar (para alterar 'exit' para '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
fonte