조건 연산자를 사용하여 레시피를 실행하는 중 오류가 발생했습니다.

조건 연산자를 사용하여 레시피를 실행하는 중 오류가 발생했습니다.

내 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"

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

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

|| true무늬이 특정 경우에도 작동하지만 무시됩니다 echo. false인 경우 if condition; then command; fiMake가 중지되지는 않지만 오류를 고려하고 모든 오류는 무시됩니다.conditioncommandcondition && command || true

관련 정보