2014-10-28 4 views
2

Я хотел бы использовать небольшой скрипт для выполнения какой-либо косметической работы на выходе моего gcc.Распространять статус выхода по трубам

Поэтому я использую эту команду:

mygcc foo.c 2>&1 | myscript.pl 

В основном мой сценарий делает такие вещи, как это:

$error = 0; 
while(<>) 
{ 
    s/^"(.*)"\s*,\s*line\s*(\d+)\s*:\s*(cc\d+)\s*:/colored("[$3]", 'bold red').colored(" $1", 'red').":".colored("$2", 'yellow')/ge; 
    s/ \^/colored(" ^", 'yellow')/e; 
    s/(error:.*$)/colored($1, 'red')/ge; 
    s/(warning.*$)/colored($1, 'yellow')/ge; 
    print; 
    $error = -1; 
}  

К сожалению, код выхода из НКИ не правильно распространяющийся через трубу. Мне нужно сделать, чтобы получить код выхода из gcc и записать его из моего сценария.

Без этого make не будет корректно останавливать процесс сборки в случае ошибки.

Как я могу это достичь?

ответ

1

Попробуйте использовать суб скорлупу:

(mygcc foo.c; echo "gcc returned $?") |& myscript.pl 

(cmd) конструкция используется для запуска cmd в суб-оболочке. Ваша текущая оболочка будет форкировать себя, а команды будут выполняться дочерней оболочкой. Это простой способ запускать несколько команд и передавать выходные данные в канал.

Переменная $? - это статус выхода последней команды.

Конструкция cmd1 |& cmd1 эквивалентна cmd1 2>&1 | cmd2

0

Посмотрите на this. Затем вы можете использовать переменную %ENV для доступа к статусу возврата gcc и вернуть это значение из вашего perl-скрипта.

Смежные вопросы