명령이 실패하면 명령을 중단하지 않도록 GNU Make 3.81에 지시하려고 -
하지만 다음 명령에서 종료 상태를 확인하고 더 유익한 메시지를 인쇄하고 싶습니다. 그러나 아래 내 Makefile이 실패합니다.
$ cat Makefile
all:
-/bin/false
([ $$? -eq 0 ] && echo "success!") || echo "failure!"
$
$ make
/bin/false
make: [all] Error 1 (ignored)
([ $? -eq 0 ] && echo "success!") || echo "failure!"
success!
Makefile이 왜 “성공!” “실패!”대신 ?
최신 정보:
허용되는 답변을 따르고 확장하는 방법은 다음과 같습니다.
failure:
@-/bin/false && ([ $$? -eq 0 ] && echo "success!") || echo "failure!"
success:
@-/bin/true && ([ $$? -eq 0 ] && echo "success!") || echo "failure!"
답변
Makefile 규칙의 각 업데이트 명령은 별도의 셸에서 실행됩니다. 그래서 $? 이전에 실패한 명령의 종료 상태를 포함하지 않고 $에 대한 기본값이 무엇입니까? 새로운 껍질에. 그게 왜 당신의 [$? -eq 0] 테스트는 항상 성공합니다.
답변
0이 아니고 0 이 아닌 리턴 값의 경우 진행 $?
되므로 &&
작동 하므로 테스트가 필요하지 않습니다 .$?
||
그리고 반환 값에서 행의 마지막 진행 프로그램 호출에서 가져 오기 때문에 마이너스가 필요하지 않습니다. 그래서 이것은 잘 작동합니다
실패:
@/bin/false && echo "success!" || echo "failure!"
성공:
@/bin/true && echo "success!" || echo "failure!"
반대의 경우 : 자신의 메시지를 작성하고 0이 아닌 값으로 make 프로세스를 중단하려면 다음과 같이 작성해야합니다.
실패:
@/bin/false && echo "success!" || { echo "failure!"; exit 1; }
답변
에서 는 GNU 메이크 문서 :
‘-‘또는 ‘-i’플래그로 인해 오류를 무시해야하는 경우 make는 쉘이 종료 한 상태 코드를 알려주는 메시지를 출력한다는 점을 제외하고 는 오류 리턴을 성공 과 동일 하게 처리합니다. 오류가 무시되었다고 말합니다.
make
이런 경우에 종료 상태 를 활용하려면 make
스크립트에서 실행하십시오 .
#!/bin/bash
make
([ $? -eq 0 ] && echo "success!") || echo "failure!"
그리고 Makefile에 다음이 포함되도록하십시오.
all:
/bin/false