Альтернатива смотреть, которые поддерживают цвета

12

У меня есть команда ( phpunit), которая имеет цветной вывод. Согласно команде watch, у меня должна быть возможность использовать --colorфлаг, чтобы разрешить прохождение цветопередачи. Тем не менее, это не работает. Есть ли другие способы решения этой проблемы?

netbrain
источник
5
Вы уверены, что это не команда, которая не выводит цвета, когда стандартный вывод не является терминалом? Попробуйphpunit | cat
энзотиб
phpunit | catне работает к сожалению. Однако подход с использованием bash-скрипта работал отлично. Благодарность!
мозгов
2
@netbrain: как предполагается, тот факт, что phpunit | catне работает, является признаком того, в чем проблема, phpunitа не в watch.
Энзотиб
1
На некоторых распространенных Unixes (таких как Snow Leopard) --colorнедопустимый флаг для watch.
Стефан Ласевски

Ответы:

3

phpunit | catне работает (сигнализирует, что это не проблема, watchа phpunit команда).

В качестве альтернативы, следующий подход bash-скрипта отлично работает для меня:

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

Использование:

$ botch my-command
netbrain
источник
6
Пожалуйста, обновите ваш ответ с более подробной информацией. Как бы то ни было, если комментарии к вашему вопросу будут удалены, это не очень полезно. Включите, по крайней мере, ссылку на тот скрипт, который вы используете, или лучше: что бы вы в итоге ни делали, это поможет будущим посетителям, если эта ссылка не работает.
Мат
@netbrain также phpunit | catне должен был работать. Предполагалось, что это будет тест, который докажет, что watchне удалял цвета, а скорее phpunitне выводил их, когда заметил, что STDOUT не TTY.
Патрик
phpunit --colors=always производит вывод цвета, когда не подключен напрямую к терминалу.
Simohe
0

Здесь моя реализация, это bash-скрипт, но его очень легко преобразовать в функцию (чтобы изменить 'exit' на '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
Алехандро Бесада Хуэс
источник