我有一个小脚本,可以对编译器(maven)输出进行着色,因此不会再忽视错误。
#!/bin/sh
export TEXT_YELLOW=`tput setaf 3`
export TEXT_RED=`tput setaf 1`
export RESET_FORMATTING=`tput sgr0`
mvn $* | sed \
-e "s/\(\[WARNING\].*\)/${TEXT_YELLOW}\1${RESET_FORMATTING}/g" \
-e "s/\(\[ERROR\].*\)/${TEXT_RED}\1${RESET_FORMATTING}/g"
问题是我的编译器具有的shell特性中的shell(mvn cli:execute-phase
)。在屏幕上可以看到像maven2>
这样的命令提示符,然后用户可以输入命令。不幸的是,由于我的脚本,我只看到一个闪烁的光标。只有当我按下回车键时,才会弹出maven2>
prompt-prefix-text。
我的猜测是 sed 在屏幕上打印内容之前正在等待EOL。要修复它,我必须查看流是否以字符串 maven2> 开头。如果是,则直接打印到终端,否则转发到 sed 。在bash中有可能吗?
答案 0 :(得分:1)
好的,我找到了解决方案。我尝试了很多东西,但最终还是无法用bash解决问题。所以我写了一个python脚本而且它有效。只需将maven输出传递给脚本,如mvn cli:execute-phase | colorize.py
。也可以在bashrc中编写别名,以便所有maven调用都有彩色输出。
#!/usr/bin/python
# Same as regular mvn command but with colored output.
import sys, subprocess, os, time
def colorize( line ):
red = '\033[1;31m'
yellow = '\033[1;33m'
endcolor = '\033[1;m'
if ("[ERROR]" in line) or ("ERROR" in line ) or ( "Failures" in line ) or ( "Errors" in line ):
print red + line + endcolor,
elif ("[WARNING]" in line) or ( "WARN" in line ):
print yellow + line + endcolor,
else:
print line,
line=""
printPrompt = True
while True:
c = sys.stdin.read(1)
if not c:
# eof
break
line = line + c
if printPrompt:
if line.startswith("maven2>"):
print "maven2>",
sys.stdout.flush()
printPrompt = False
else:
# rewrite the current line to console
sys.stdout.write('\r')
print line,
sys.stdout.flush()
if c.endswith("\n"):
colorize(line)
line = ""
printPrompt = True
答案 1 :(得分:1)
@mainbrain你的pythons的脚本工作正常,除了“mvn archetype:generate”,当提示“定义属性'groupId':::”的提示时。
示例:
mvn archetype:generate \
-DarchetypeRepository=repo1.maven.org \
-DarchetypeGroupId=org.codehaus.mojo \
-DarchetypeArtifactId=gwt-maven-plugin \
-DarchetypeVersion=2.4.0