색상 지원 시계 대안

색상 지원 시계 대안

phpunit컬러 출력이 있는 명령( )이 있습니다 . watch명령 에 따르면 이 --color플래그를 사용하여 색상 렌더링을 통과할 수 있어야 합니다. 그러나 이것은 작동하지 않습니다. 이 문제를 해결할 다른 방법이 있나요?

답변1

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

답변2

이것은 나에게 효과적입니다.

watch --color phpunit9 --colors=always

색상 표시가 있으니 참고하세요.둘 다보다그리고PHP 단위

phpunit이 파이프 상황에 있음을 감지하면 강제로 사용하지 않는 한 터미널 색상 시퀀스를 비활성화합니다 --colours=always. 그렇지 않은 경우 시계는 색상을 렌더링할 수 없으므로 --color둘 다 필요합니다.

(이것은 Robert Waelder의 답변과 동일하지만 OP의 명령 phpunit을 구체적으로 다루기 때문에 여기에 내 답변을 남겨 둡니다)

답변3

여기에 내 구현이 있습니다. 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

답변4

나는 같은 문제에 직면하여 잠시 놀다가 사용했습니다.

watch --color dmesg --color=always

예상대로 dmesg를 풀 컬러로 출력합니다. 따라서 시계에 입력된 모든 명령에 대해 보다 명확한 색상 매개변수를 사용하는 것이 도움이 될 수 있습니다.

관련 정보