Альтернатива дивитися, які кольори підтримують


12

У мене є команда ( phpunit), яка має кольоровий вихід. Відповідно до watchкоманди, я повинен мати можливість використовувати --colorпрапор, щоб дозволити передачу кольорів. Однак це не працює. Чи є інші способи вирішення цього питання?


5
Ви впевнені, що це не команда, яка не виводить кольори, коли stdout не є терміналом? Спробуйтеphpunit | cat
enzotib

1
Хоча @enzotib, ймовірно, має рацію, сценарій BASH у будь-якому разі може бути використаний як спосіб вирішення .
sr_

phpunit | catна жаль, не працювало. Однак підхід до сценарію bash спрацював чудово. Дякую!
netbrain

2
@netbrain: як передбачається, той факт, що phpunit | catне працюють, є симптомом того, що проблема полягає в, phpunitа не в watch.
enzotib

1
На деяких поширених Unixes (наприклад, Snow Leopard), --colorце не дійсний прапор для watch.
Стефан Ласєвський

Відповіді:


3

phpunit | catне працювало (сигналізуючи, що це не проблема, watchа phpunit команда).

Як альтернатива, наступний підхід баш сценарію працював для мене чудово:

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

6
Будь ласка, оновіть свою відповідь більш детально. Так як, якщо коментарі до вашого питання видаляються, це не дуже корисно. Включіть принаймні посилання на той сценарій, який ви використовуєте, або ще краще: все, що ви в кінцевому підсумку робите саме так, це може допомогти майбутнім відвідувачам, якщо це посилання втратить чинність.
Мат

@netbrain також phpunit | catне повинен був працювати. Це повинно було бути тестом, щоб довести, що watchвін не видаляв кольори, а, скоріше, phpunitне виводив їх, коли помічав, що STDOUT не був TTY.
Патрік

phpunit --colors=always видає кольоровий вихід, коли він безпосередньо не підключений до терміналу.
simohe

0

Тут моя реалізація, це bash-скрипт, але дуже легко перетворити його на функцію (змінити "вихід" на "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
Використовуючи наш веб-сайт, ви визнаєте, що прочитали та зрозуміли наші Політику щодо файлів cookie та Політику конфіденційності.
Licensed under cc by-sa 3.0 with attribution required.