EOL之前的流程流

时间:2011-11-23 11:14:00

标签: bash shell maven stream sed

我有一个小脚本,可以对编译器(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中有可能吗?

2 个答案:

答案 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