내 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를 중지시키지 않지만 의 오류를 고려하는 반면 모든 오류를 무시합니다.condition
command
condition && command || true