Alternativa para ver qué colores admiten

12

Tengo un comando ( phpunit) que tiene una salida de color. De acuerdo con el watchcomando, debería poder usar la --colorbandera para permitir que pase la reproducción del color. Sin embargo, esto no está funcionando. ¿Hay alguna otra forma de resolver esto?

netbrain
fuente
55
¿Está seguro de que ese no es el comando que no genera colores cuando stdout no es un terminal? Pruebaphpunit | cat
enzotib
1
Si bien @enzotib probablemente tenga razón, un script BASH podría usarse como solución alternativa de todos modos.
Sr_
phpunit | catNo funcionó desafortunadamente. Sin embargo, el enfoque del script bash funcionó muy bien. ¡Gracias!
netbrain
2
@netbrain: como se supone, el hecho de que phpunit | catno funcione es un síntoma de que el problema está dentro phpunity no dentro watch.
enzotib
1
En algunos Unix comunes (como Snow Leopard), --colorno es una bandera válida para watch.
Stefan Lasiewski

Respuestas:

3

phpunit | catno funcionó (lo que indica que esto no es un problema watchsino el phpunit comando).

Como alternativa, el siguiente enfoque de script bash funcionó muy bien para mí:

#!/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
fuente
66
Actualice su respuesta con más detalles. Tal como están las cosas, si se eliminan los comentarios sobre su pregunta, no es muy útil. Incluya al menos el enlace a ese script que está utilizando, o mejor: haga lo que termine haciendo exactamente para que pueda ayudar a futuros visitantes si ese enlace se corta.
Mat
@netbrain phpunit | cattampoco se suponía que funcionara. Se suponía que era una prueba para demostrar que watchno eliminaba los colores, sino que phpunitno los emitía cuando notó que STDOUT no era un TTY.
Patrick
phpunit --colors=always produce salida de color cuando no está conectado directamente a un terminal.
simohe
0

Aquí mi implementación, es un script bash pero es muy fácil convertirlo a función (para cambiar 'salir' a 'regresar')

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