Alternatywa do oglądania, która obsługuje kolory


12

Mam polecenie ( phpunit), które ma kolorowe wyjście. Zgodnie z watchpoleceniem powinienem móc użyć --colorflagi, aby umożliwić przejście renderowania kolorów. To jednak nie działa. Czy istnieją inne sposoby rozwiązania tego problemu?


5
Czy na pewno nie jest to polecenie, które nie wyświetla kolorów, gdy standardowe wyjście nie jest terminalem? Spróbujphpunit | cat
enzotib,

1
Chociaż @enzotib prawdopodobnie ma rację, skrypt BASH i tak może zostać użyty jako obejście problemu .
sr_

phpunit | catnie działa niestety. Jednak podejście oparte na skryptach bash działało świetnie. Dzięki!
netbrain

2
@netbrain: jak przypuszczano, fakt, że phpunit | catnie działają, jest symptomem tego, że problem występuje phpuniti nie występuje watch.
enzotib

1
W niektórych popularnych systemach uniksowych (takich jak Snow Leopard) --colornie jest prawidłową flagą dla watch.
Stefan Lasiewski

Odpowiedzi:


3

phpunit | catnie działał (sygnalizując, że nie jest to problem, watchale phpunit polecenie).

Alternatywnie, następujące podejście do skryptu bash działało dla mnie świetnie:

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

Stosowanie:

$ botch my-command

6
Zaktualizuj swoją odpowiedź, podając więcej szczegółów. W tej sytuacji usunięcie komentarzy do pytania nie jest zbyt pomocne. Podaj przynajmniej link do tego skryptu, którego używasz, lub lepiej: cokolwiek skończyłeś robić dokładnie, aby pomóc przyszłym użytkownikom, jeśli ten link zniknie.
Mat.

@netbrain również phpunit | catnie miał działać. To miał być test, aby udowodnić, że watchnie usuwa kolorów, ale raczej phpunitnie wyświetlał ich, gdy zauważył, że STDOUT nie był TTY.
Patrick

phpunit --colors=always produkuje kolorowe wydruki, gdy nie jest bezpośrednio podłączone do terminala.
podobnie

0

Tutaj moja implementacja, to skrypt bashowy, ale bardzo łatwo przekonwertować go na funkcję (zmienić „wyjście” na „powrót”)

#!/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
Korzystając z naszej strony potwierdzasz, że przeczytałeś(-aś) i rozumiesz nasze zasady używania plików cookie i zasady ochrony prywatności.
Licensed under cc by-sa 3.0 with attribution required.