Как использовать код возврата первой программы в командной строке pipe - PullRequest
6 голосов
/ 09 мая 2011

Я пишу простую программу, которая анализирует выходные данные компилятора и форматирует любые сообщения об ошибках, чтобы используемая нами среда IDE (Visual Studio) могла их анализировать. Мы используем nmake для сборки, и он будет вызывать компилятор с помощью командной строки, подобной этой:

cc166.exe SOME_FLAGS_HERE MyCFile.c 2>&1 | TaskingVXToVisualReformat.exe

Теперь проблема в том, что код возврата компилятора, cc166, не возвращается к nmake. Используется только код возврата моего переформататора, что означает, что если я верну ноль из программы переформатирования, nmake продолжит сборку вместо прерывания. Как я могу вернуть код возврата от компилятора (cc166.exe) к nmake?

Может ли моя программа переформатирования прочитать код возврата компилятора и использовать его при определении собственного кода возврата? Переформататор написан на C #.

Ответы [ 2 ]

2 голосов
/ 17 ноября 2014

Я бы поместил инструкции по компиляции в скрипт bash и использовал бы его функцию pipefail:

Состояние выхода конвейера - это состояние выхода последней команды в конвейере, если толькоопция pipefail включена.Если pipefail включен, состояние возврата конвейера - это значение последней (самой правой) команды для выхода с ненулевым статусом или ноль, если все команды завершаются успешно.

Давайте попробуем это спростой тест:

$ cat bash_pipe.sh
#!/bin/bash
set -o pipefail
ls $1 2>&1 | perl -ne '{print;}'

Если мы запустим его с существующим файлом, код выхода будет равен 0 (передается через канал):

$ ./bash_pipe.sh bash_pipe.sh 
bash_pipe.sh
$ echo $?
0

С другой сторонысбой команды с несуществующим файлом:

./bash_pipe.sh inexistent
ls: cannot access inexistent: No such file or directory
echo $?
2

Так что в вашем случае вам нужно поместить инструкции компиляции в скрипт типа

$ cat compilation_script.sh
#!/bin/bash
set -o pipefail
cc166.exe SOME_FLAGS_HERE $1 2>&1 | TaskingVXToVisualReformat.exe

и вызвать его напрямую (если вы можете) или косвенно через

bash -c "compilation_script.sh MyCFile.c"

Примечание: опция pipefail была введена в bash версии 3.

0 голосов
/ 09 мая 2011

Вы можете разделить одну команду на две и сохранить результаты компиляции во временном файле:

cc166.exe SOME_FLAGS_HERE MyCFile.c > CCRESULT.TXT 2>&1
if not errorlevel 1 TaskingVXToVisualReformat.exe < CCRESULT.TXT
...