2011-05-09 3 views
5

컴파일러의 출력을 구문 분석하고 오류 메시지를 다시 포맷하여 사용하는 IDE (Visual Studio)에서 구문 분석 할 수있는 간단한 프로그램을 작성하고 있습니다 . 우리는 구축 nmake를 사용하고,이 같은 명령 줄을 사용하여 컴파일러를 호출합니다 : 파이프 명령 줄에서 첫 번째 프로그램의 반환 코드를 사용하는 방법

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

이제 문제는 컴파일러, cc166의 리턴 코드가, nmake 다시 공급되지 않는 것입니다. 리 포맷 프로그램의 리턴 코드 만 사용됩니다. 즉, 리 포맷 프로그램에서 0을 반환하면 nmake는 중단하지 않고 빌드를 계속 진행합니다. 컴파일러 ( cc166.exe)의 리턴 코드를 nmake으로 어떻게 피드백 할 수 있습니까?

제 형식 프로그램이 컴파일러의 반환 코드를 읽고 자체 리턴 코드를 결정할 때 사용할 수있는 방법이 있습니까? 리 포맷 터는 C#으로 작성되었습니다.

답변

0

두 가지로 하나의 명령을 분리하고 임시 파일에 컴파일 결과를 유지할 수 있습니다 : 나는 bash는 스크립트의 편집 지침을 둘 것

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

이것은 질문에 대답하지 않습니다. cc166이 성공하면 최종 리턴 코드도 성공한 것처럼 보입니다. 하지만 실패하면 다시 작성자의 반환 코드가 여전히 사용됩니다. 따라서 cc166이 실패하고 reformator가 "성공"의 총 수익률에서 성공합니다 ("실패"해야 할 때). 또한 cc166의 유일한 실패는 return of 1 –

+0

Windows 쉘 반환 코드 0은 성공이고 다른 값은 실패합니다. "errorlevel 1이 아닌 경우"조건은 첫 번째 명령이 0을 반환하면 실제로 성공합니다. Windows의 경우 "errorlevel 1"은 "오류 코드 1보다 크거나 같음 – SlavaGu

+0

cc166이 1 (또는 2, 3 등)을 반환하고 'TaskingVXToVisualReformat.exe'가 0을 반환하면 어떻게 될지 생각합니까? 전체 스크립트가 a를 반환하지 않습니다. 성공, 사실 cc166 실제로 실패에도 불구하고? –

1

과 pipefail 기능을 사용합니다

pipefail 옵션을 사용하지 않는 한 파이프 라인의 종료 상태는 파이프 라인에서 마지막 명령의 종료 상태입니다. pipefail이 활성화 된 경우 파이프 라인의 반환 상태는 0이 아닌 상태에서 종료 할 마지막 (가장 오른쪽) 명령의 값이거나 모든 명령이 성공적으로 끝나면 0입니다.

의 간단한 테스트로 해보자 : 우리는 기존의 파일을 실행하면

$ 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 

: 다른 측면 명령에

은 inexistent 파일 실패 N 귀하의 경우는

bash -c "compilation_script.sh MyCFile.c" 

주를 통해 간접적

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

같은 스크립트의 편집 지침을 넣고 (가능하면) 직접 전화를 걸거나 필요 했어 다음 pipefail 옵션이 도입되었습니다 배쉬 버전 3.

관련 문제