поток обработки перед EOL - PullRequest
2 голосов
/ 23 ноября 2011

У меня есть небольшой скрипт, который раскрашивает вывод компилятора (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"

Проблема в том, что оболочка внутри функции оболочки моего компилятора (mvn cli:execute-phase).На экране должна появиться командная строка типа maven2>, и пользователь сможет вводить команды.К сожалению, из-за моего сценария я не вижу ничего, кроме мигающего курсора.Только когда я нажимаю клавишу ввода, всплывает maven2> текст приглашения-префикса.

Я предполагаю, что sed ждет EOL, прежде чем что-то напечатает на экране.Чтобы это исправить, мне нужно посмотреть, начинается ли поток со строки maven2> .Если это произойдет, распечатайте его непосредственно на терминал, в противном случае отправьте его на sed .Возможно ли это в bash?

Ответы [ 2 ]

1 голос
/ 11 июня 2012

@ mainbrain Скрипт вашего питона работает нормально, за исключением «mvn archetype: generate», когда отображается приглашение «Определить значение для свойства groupId»:: ».

пример :

mvn archetype:generate \
   -DarchetypeRepository=repo1.maven.org \
   -DarchetypeGroupId=org.codehaus.mojo \
   -DarchetypeArtifactId=gwt-maven-plugin \
   -DarchetypeVersion=2.4.0
1 голос
/ 30 ноября 2011

Хорошо, я нашел решение.Я много чего перепробовал, но не смог решить проблему чисто с 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
...