我有一个用于着色编译器(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特性(mvn cli:execute-phase)中的shell。在那里,像maven2>这样的命令提示符应该可以在屏幕上看到,然后用户就可以输入命令。不幸的是,由于我的脚本,我只看到一个闪烁的光标。只有当我按回车键时,maven2>提示前缀-文本才会弹出。
我的猜测是,sed在屏幕上打印东西之前正在等待EOL。要修复它,我必须查看流是否以字符串maven2>开头。如果不打印,则直接打印到终端,否则将其转发给sed。在巴什有可能吗?
发布于 2011-11-30 09:42:51
好吧,我找到了解决办法。我尝试了很多事情,但最终还是不能完全用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发布于 2012-06-11 16:49:11
@mainbrain --除了"mvn原型:generate“提示符"Define for property‘groupId”::“”之外,您的pythons脚本工作得很好。
示例:
mvn archetype:generate \
-DarchetypeRepository=repo1.maven.org \
-DarchetypeGroupId=org.codehaus.mojo \
-DarchetypeArtifactId=gwt-maven-plugin \
-DarchetypeVersion=2.4.0https://stackoverflow.com/questions/8241222
复制相似问题