명령이 실패하더라도 작성을 중단하지 말고 종료 상태를 확인하십시오.


22

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

2
.ONESHELL:지시문 을 조사 할 수 있습니다 .
Jonathan Leffler

.ONESHELL은 하나의 쉘에서 모든 영수증 블록을 실행합니다. 첫 번째 명령이 실패하면 다음 명령이 문제없이 실행됩니다. 이를 방지하기 위해 .SHELLFLAGS = -ec사용해야합니다. 그러나이 경우 -make는 오류를 무시하지만 여전히 모든 블록에 실패하기 때문에 접두사 more를 사용할 수 없습니다 (영수증의 개인 명령에). 따라서 || :명령을 무시하는 솔루션 중 하나입니다. 그러나 (Windows가되지 크로스 플랫폼이 아니다 || :|| true)
폴 - AG

답변:


14

Makefile 규칙의 각 업데이트 명령은 별도의 셸에서 실행됩니다. 그래서 $? 이전에 실패한 명령의 종료 상태를 포함하지 않고 $에 대한 기본값이 무엇입니까? 새로운 껍질에. 그게 왜 당신의 [$? -eq 0] 테스트는 항상 성공합니다.


10

0이 아니고 0 이 아닌 리턴 값의 경우 진행 $?되므로 &&작동 하므로 테스트가 필요하지 않습니다 .$?||

그리고 반환 값에서 행의 마지막 진행 프로그램 호출에서 가져 오기 때문에 마이너스가 필요하지 않습니다. 그래서 이것은 잘 작동합니다

실패:

      @/bin/false && echo "success!" || echo "failure!" 

성공:

      @/bin/true && echo "success!" || echo "failure!"

반대의 경우 : 자신의 메시지를 작성하고 0이 아닌 값으로 make 프로세스를 중단하려면 다음과 같이 작성해야합니다.

실패:

      @/bin/false && echo "success!" || { echo "failure!"; exit 1; }

8

에서 는 GNU 메이크 문서 :

'-'또는 '-i'플래그로 인해 오류를 무시해야하는 경우 make는 쉘이 종료 한 상태 코드를 알려주는 메시지를 출력한다는 점을 제외하고 는 오류 리턴을 성공 과 동일 하게 처리합니다. 오류가 무시되었다고 말합니다.

make이런 경우에 종료 상태 를 활용하려면 make스크립트에서 실행하십시오 .

#!/bin/bash
make
([ $? -eq 0 ] && echo "success!") || echo "failure!"

그리고 Makefile에 다음이 포함되도록하십시오.

all:
    /bin/false
당사 사이트를 사용함과 동시에 당사의 쿠키 정책개인정보 보호정책을 읽고 이해하였음을 인정하는 것으로 간주합니다.
Licensed under cc by-sa 3.0 with attribution required.