我有一个命令 ( 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 脚本,但很容易将其转换为函数(将“退出”更改为“返回”)
#!/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。因此,在输入到手表中的任何命令上使用更加明确的颜色参数可能会有所帮助。