Alternative zu beobachten, welche Farben unterstützen

12

Ich habe einen Befehl ( phpunit), der eine farbige Ausgabe hat. Gemäß dem watchBefehl, sollte ich in der Lage sein, das --colorFlag zu verwenden, um die Farbwiedergabe durchzulassen. Dies funktioniert jedoch nicht. Gibt es noch andere Möglichkeiten, dies zu lösen?

netbrain
quelle
5
Sind Sie sicher, dass dies nicht der Befehl ist, der keine Farben ausgibt, wenn stdout kein Terminal ist? Tryphpunit | cat
Enzotib
1
Während @enzotib wahrscheinlich richtig ist, könnte ein BASH-Skript trotzdem als Workaround verwendet werden.
Sr_
phpunit | cathat leider nicht funktioniert Der Bash-Skript-Ansatz funktionierte jedoch hervorragend. Vielen Dank!
Netbrain
2
@netbrain: Wie vermutet, ist die Tatsache, dass phpunit | cates nicht funktioniert, ein Symptom dafür, dass das Problem vorliegt phpunitund nicht watch.
Enzotib
1
Auf einigen gängigen Unixen (wie Snow Leopard) --colorist keine gültige Flagge für watch.
Stefan Lasiewski

Antworten:

3

phpunit | cathat nicht funktioniert (signalisiert, dass dies kein Problem ist, watchaber der phpunit Befehl).

Alternativ hat der folgende Bash-Skript-Ansatz für mich hervorragend funktioniert:

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

Verwendung:

$ botch my-command
netbrain
quelle
6
Bitte aktualisieren Sie Ihre Antwort mit weiteren Details. Wie es ist, wenn die Kommentare zu Ihrer Frage entfernt werden, ist es nicht sehr hilfreich. Fügen Sie mindestens den Link zu dem Skript ein, das Sie verwenden, oder besser: Was auch immer Sie genau getan haben, damit es zukünftigen Besuchern helfen kann, wenn dieser Link nicht mehr funktioniert.
Mat
@netbrain sollte auch phpunit | catnicht funktionieren. Es sollte ein Test sein, um zu beweisen, watchdass die Farben nicht entfernt wurden, sondern nicht phpunitausgegeben wurden, als festgestellt wurde, dass STDOUT kein TTY war.
Patrick
phpunit --colors=always Erzeugt eine Farbausgabe, wenn keine direkte Verbindung zu einem Terminal besteht.
Simohe
0

Hier meine Implementierung, es ist ein Bash-Skript, aber es ist sehr einfach, es in Funktion umzuwandeln (um 'exit' in 'return' zu ändern)

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