支持颜色的手表替代方案

支持颜色的手表替代方案

我有一个命令 ( phpunit),它有彩色输出。根据watch,命令我应该能够使用该--color标志来允许颜色渲染通过。但是,这不起作用。还有其他方法可以解决这个问题吗?

答案1

phpunit | cat不起作用(表明这不是命令的问题watchphpunit

作为替代方案,以下 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 脚本,但很容易将其转换为函数(将“退出”更改为“返回”)

#!/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。因此,在输入到手表中的任何命令上使用更加明确的颜色参数可能会有所帮助。

相关内容