2017-12-19 15 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後とバックスラッシュの前に)最初のコマンドラインの端に1つだった逃しました。 makeは、バックスラッシュ改行を空白(改行ではない)で置き換えるとします。だからこそテストの後にセミコロンが必要です。それはifの前に1つ必要な理由です。

$?はMakeマクロですが、シェルは$?を見て解釈しますので、2ドルが必要です。つまり、$$を使ってMakeから隠すと、マクロ呼び出しは$に展開されます。

+0

エラーを修正した後でも、私は質問で更新したエラーが発生しています。 – Venkat

+0

更新された質問を見て、私は答えを更新しました。 –

+0

エラーが発生した場合、dvipsは失敗しています。これは現在完全に動作しています。しかし出口2。次のルールの実行を中断/中止していません。あなたはその面で私を助けてください。 – Venkat

0

したがって、私はあなたがやっているような普通のBash条件を使っているのに対して、conditional directivesを使うのがベストプラクティスであるかどうか分かりません。それ以外の場合はすべての行は、単一の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'指示文でのみ動作します。バックスラッシュは正当な理由がありましたが、セミコロンが必要です。 –

関連する問題