명령이 실패하더라도 작성을 중단하지 말고 종료 상태를 확인하십시오. 1 (ignored) ([ $? -eq 0 ] &&

명령이 실패하면 명령을 중단하지 않도록 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


답변