나는 명령이 실패하더라도 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!"
답변1
규칙의 각 업데이트 명령은 Makefile
별도의 셸에서 실행됩니다. 따라서 이전에 실패한 명령의 종료 상태는 포함되지 않으며 $?
새 셸의 기본값입니다. $?
이것이 바로 [ $? -eq 0 ]
테스트가 항상 성공하는 이유입니다.
답변2
0 이면 작동하고 반환 값이 0이 아니면 계속 진행하기 $?
때문에 테스트할 필요가 없습니다 .&&
$?
||
그리고 make의 반환 값은 해당 라인의 마지막 진행 호출에서 가져오기 때문에 빼기 기호가 필요하지 않습니다. 그래서 이것은 훌륭하게 작동합니다
실패하다:
@/bin/false && echo "success!" || echo "failure!"
성공:
@/bin/true && echo "success!" || echo "failure!"
반대의 경우가 발생합니다. 자신만의 메시지를 실행하고 0이 아닌 값으로 make 프로세스를 중단하려면 다음과 같이 작성해야 합니다.
실패하다:
@/bin/false && echo "success!" || { echo "failure!"; exit 1; }
답변3
~에서GNU make 문서:
"-" 또는 "-i" 플래그로 인해 오류를 무시해야 하는 경우,make는 오류 반환을 성공으로 처리합니다.단, 셸이 종료되었을 때 상태 코드를 알려주고 오류가 무시되었음을 나타내는 메시지를 인쇄한다는 점만 다릅니다.
make
이 경우 종료 상태를 이용 하려면 make
스크립트에서 실행하십시오.
#!/bin/bash
make
([ $? -eq 0 ] && echo "success!") || echo "failure!"
그리고 Makefile에 다음을 포함시키십시오:
all:
/bin/false
답변4
이것이 내가 한 일입니다.
.PHONY: test-cleanup
test-cleanup:
$(eval CLEANUP = echo "Some cleanup procedure")
@/bin/true && touch _testok || $(CLEANUP) ;\
if [ -f "_testok" ]; then \
rm -f _testok ;\
echo "What a success!" ;\
else \
echo "Failure :-(" ;\
exit 1 ;\
fi
다음을 인쇄합니다.
What a success!
/bin/true
로 변경하면 /bin/false
다음과 같은 결과가 출력됩니다.
Some cleanup procedure
Failure :-(
make: *** [Makefile:4: test-cleanup] Error 1