조건부 연산자로 레시피를 실행할 때 오류 발생

조건부 연산자로 레시피를 실행할 때 오류 발생

내 Makefile은 매우 간단합니다.

all:
      [ -f MyFile ] && echo "MyFile exists"

물론 레시피 라인은 탭으로 시작됩니다. MyFile 파일이 실제로 존재한다면 모든 것이 정상입니다. 하지만 이 파일이 현재 디렉터리에 없으면 다음과 같은 결과가 나타납니다.

Makefile:2: 대상 'all'에 대한 레시피가 실패했습니다. make: *** [all] 오류 1

대신 if 문을 사용하여 이 오류를 제거할 수 있습니다.

all:
      if [ -f MyFile ]; then echo "MyFile exists"; fi

두 명령문 모두 make 외부의 sh 및 bash에서 잘 작동합니다. 조건 연산자를 사용할 때 make 오류가 발생하는 이유가 무엇인지 명확하지 않습니다. 무슨 일이 일어나고 있나요?

답변1

[ -f MyFile ] && echo "MyFile exists"

MyFile존재하지 않으면 0이 아닌 상태 코드로 종료됩니다 .

if [ -f MyFile ]; then echo "MyFile exists"; fi

MyFile존재하지 않는 한 성공(0) 상태 코드로 종료됩니다.그리고 echo쓰기 오류로 인해 실패합니다.

Make는 상태 코드를 사용하여 명령이 실패했는지 확인하고 명령이 실패하면 기본적으로 실행을 중지합니다. 개별 명령줄에 접두사를 붙여 이를 비활성화하거나 특수 대상을 -실행하거나 지정하여 전체적으로 비활성화할 수 있습니다 . 따라서make -i.IGNORE

-[ -f MyFile ] && echo "MyFile exists"

MyFile둘 다 Make가 계속되도록 허용하지만, 존재하지 않는 경우 여전히 메시지를 인쇄하게 됩니다 .

make: [Makefile:14: test] 오류 1(무시됨)

패턴|| true이 특정 경우에도 작동하지만 echo. false if condition; then command; fi인 경우 Make를 중지시키지 않지만 의 오류를 고려하는 반면 모든 오류를 무시합니다.conditioncommandcondition && command || true

관련 정보