2014-05-22 3 views
4

루프 나는 파일을 만들어 다음 가지고 있지만 :메이크

n ?= 10 
all: 
    while [[ $${n} -gt 0 ]] ; do \ 
     echo $$n ; \ 
     ((n = n - 1)) ; \ 
    done 

을 그리고 내가 (make)를 실행하기 위해 노력하고있어 때, 실행 오류와 함께 실패합니다

make: *** [all] Error 1 

내가 할 수있는 ' 이 실패의 이유를 이해하지 못합니다.
도움을 주시면 감사하겠습니다.

답변

10

: 귀하의 경우 는 지난 retrun 코드는 1

즉, 단순히 라인 (5)을 수정, 오류를 방지하기 위해, N = 2 ((n = n - 1))의 결과 당신 당신의 메이크 파일이 매우 휴대하기 힘들게하고 있습니다. 항상 /bin/sh을 사용하여 조리법을 호출하십시오. 작성한 레시피는 실제로 bash 스크립트이며 POSIX/bin/sh에서 작동하지 않습니다./bin/bash를/bin/sh로 사용하는 시스템에서만 작동합니다. 많은 사람들 (대부분 당신이 그들을 세는 방법에 따라)은 그렇지 않습니다.

당신은 다시 작성할 수 있습니다 :

n ?= 10 
all: 
     n=$(n); \ 
     while [ $${n} -gt 0 ] ; do \ 
      echo $$n ; \ 
      n=`expr $$n - 1`; \ 
     done; \ 
     true 
+0

당신이 SHELL =/빈/bash는 추가하면 메이크 파일의 상단에 , 배쉬 사용됩니다 https://www.gnu.org/software /make/manual/html_node/ChOosing-the-Shell.html –

+1

물론입니다. 하지만 휴대 할 필요가없는 코드를 작성하는 이유는 무엇입니까? 'SHELL =/bin/bash'를 설정하면'/ bin/bash'를 제공하지 않는 시스템에서 makefile이 실패합니다. – MadScientist

3

규칙은 마지막 리턴 코드를 검사합니다. 0이 아니면 make이 오류를 발생시킵니다. 그냥주의하는 것이

((n = n - 1)) || true; \