2017-12-19 1 views
0

나는 명령이 어떤 오류없이 실행될 때, 즉 실패한 경우 성공과 실패를 인쇄해야하는 경우에 대한 조건문으로 명령을 쓰려고했다. 명령의 긴 콘솔 메시지를 인쇄하지 못하게하려고합니다. 아래 코드는 인쇄 성공 또는 실패 메시지와 같은 조건문없이 완벽하게 작동하는 코드입니다.if 문과 같은 조건에서 명령을 작성하는 방법은 무엇입니까?

$(BASENAME).pdf: $(BASENAME).ps 
    ps2pdf $(BASENAME).ps $(BASENAME).pdf 

$(BASENAME).ps: $(BASENAME).dvi 
    dvips -Ppdf $(BASENAME).dvi -o $(BASENAME).ps 

나는, 내 실행을 실패

$(BASENAME).pdf: $(BASENAME).ps 
    @out=ps2pdf $(BASENAME).ps $(BASENAME).pdf > /dev/null 2>&1 && echo " 5. ps2pdf successful" || echo " 5. ps2pdf failed" 

$(BASENAME).ps: $(BASENAME).dvi 

    dvips -Ppdf $(BASENAME).dvi -o $(BASENAME).ps > /dev/null 2>&1\ 
    if [ $? -eq 0 ];\ 
      then \ 
      echo " 4. dvips successful";\ 
    else \ 
      echo " 4. dvips failed";\ 
      exit 2;\ 
    fi 

위와 같이 변경하고 심지어 세미콜론으로 업데이트 한 후 오류

dvips -Ppdf basename_04.dvi -o basename_04.ps \ 
if [ basename_04.dvi -eq 0 ];\ 
     then \ 
     echo " 4. dvips successful";\ 
else \ 
     echo " 4. dvips failed";\ 
     exit 2;\ 
fi 
/bin/sh: -c: line 2: syntax error near unexpected token `then' 
/bin/sh: -c: line 2: `  then \' 
make: *** [basename_04.ps] Error 1 

아래와 같은 코드를 실행하는 동안 나에게 오류를 제공하는 시도 아래 오류가 발생합니다.

dvips -Ppdf nkukunur_04.dvi -o nkukunur_04.ps > /dev/null 2>&1 ;\ 
     if [ nkukunur_04.dvi -eq 0 ]; \ 
       then \ 
       echo " 4. dvips successful"; \ 
     else \ 
       echo " 4. dvips failed"; \ 
       exit 2; \ 
     fi 
/bin/sh: line 1: [: nkukunur_04.dvi: integer expression expected 
    4. dvips failed 

문제 해결에 도움주세요.

답변

1

세미콜론 누락 - 더블 달러를 : 세미콜론 놓친

$(BASENAME).ps: $(BASENAME).dvi 
    dvips -Ppdf $(BASENAME).dvi -o $(BASENAME).ps; \ 
    if [ $$? -eq 0 ]; \ 
      then \ 
      echo " 4. dvips successful"; \ 
    else \ 
      echo " 4. dvips failed"; \ 
      exit 2; \ 
    fi 

이 ($(BASENAME).ps 후 백 슬래시 전) 첫 번째 명령 라인의 끝에 하나였다. make은 백 슬래시 - 개행을 ​​공백 (개행이 아님)으로 바꾼다고 가정합니다. 그래서 테스트 후에 세미콜론이 필요합니다. 그것이 if 앞에 너무 필요한 이유입니다.

$?은 Make 매크로이지만 쉘은 $?을보고 해석하기를 원하기 때문에 double-dollar이 필요합니다. 따라서 $$으로 Make 매크로를 숨기면 매크로 호출은 $으로 확장됩니다.

+0

오류를 수정 한 후에도 질문에 업데이트 된 오류가 발생합니다. – Venkat

+0

업데이트 된 질문을 본 후 답변을 업데이트했습니다. –

+0

오류가 발생하면 dvips를 인쇄하는 데 실패했습니다. 이제는 완벽하게 작동합니다. 그러나 출구 2; 다음 규칙의 실행을 중단하거나 종료하지 않습니다. 그면에서 나를 도우십시오. – Venkat

0

그럼, 최선의 방법이 conditional directives 대 일반 Bash 조건을 사용하는 것과 무슨 관계인지 잘 모릅니다. 그렇지 않으면 모든 행이 하나의 bash는 문으로 실행됩니다

dvips -Ppdf $(BASENAME).dvi -o $(BASENAME).ps <<<< removed backslash 
if [ $? -eq 0 ];\ 
     then \ 
     echo " 4. dvips successful";\ 
else \ 
     echo " 4. dvips failed";\ 
     exit 2;\ 
fi 

:하지만 첫 줄 뒤에 백 슬래시를 제거, 코드를 해결하기 위해 세미콜론까지 최대 ifdvipsthen에 인수로 전달하는 것은 새로운 시작 문이 예상치 못한 토큰 오류입니다.

+0

어떻게 make 파일을 종료하여 다음 단계로 진행할 수 있습니까? 나는 2 번 출구로 시도했다. 그러나 그것은 작동하지 않았다. – Venkat

+0

대신'pkill -9 make'를 사용하십시오. 그 답을 모르겠습니다. – jcarpenter2

+0

GNU Make와'.ONESHELL' 지시자에서만 작동합니다. 백 슬래시는 좋은 이유가 있었지만 앞에는 세미콜론이 필요합니다. –