2009-04-19 3 views
10

私はbashにmakefileを書いていますが、ファイルが存在するかどうかを調べようとするターゲットがあります。私にエラーを与えます。ここで 構文エラー:ファイルの終わりが予期しない( "fi"が予想される)

は、私はそれが問題ではありませんので、私はタブを使用しています

read: 
     if [ -e testFile] ; then \ 
     cat testFile\ 
     fi 

実行しようとしていますスクリプトです。

(私が入力したとき: "読み取り作る")にエラーがあるcat testFile後にセミコロンを追加

if [ -e testFile] ; then \ 
     cat testFile \ 
     fi 
/bin/sh: Syntax error: end of file unexpected (expecting "fi") 
make: *** [read] Error 2 

答えて

13

してみてください。代わり

read: 
    if [ -e testFile ] ; then cat testFile ; fi 

:たとえば

read: 
    test -r testFile && cat testFile 
+1

代替ソリューションが動作しますが、if..then構文を使用する必要があります。セミコロンを追加しても問題は解決しないようです。 – Jaelebi

+0

奇妙な。私はセミコロンで初めてそれを試して、それは仕事をしなかった。私はそれを働かせました。ありがとうございました – Jaelebi

+0

自分自身にちょうどメモ:私は元々makefileにプレーンな複数の 'bash'ステートメントを書いていて、同じ失敗を抱えていました - そして、この答えが示すように、トリックはmakefileを認識させることです単一の行としてのシェルコマンド。それゆえ、私は_both_セミコロン ';'(シェルコマンドを分けるために)_and_バックスラッシュ '\\'(後続の改行をエスケープする)が必要です。 – sdaau

2

また、私はこの問題に会いました。

その理由は、「\」の後にいくつかのコメントを追加したからです。

5

同じ問題が発生しました。これはそれを行う必要があります。

file: 
    @if [ -e scripts/python.exe ] ; then \ 
    echo TRUE ; \ 
    fi 
2

GNUは3.82を行いますので、あなたは、単一のシェルでターゲット内のすべての行を実行するために作る伝えるために、ファイルの先頭に.ONESHELL:を追加することができます。

.ONESHELL: 
SHELL := /bin/bash 

foobar: 
    if true 
    then 
     echo hello there 
    fi 

documentationを参照してください。

行の末尾に@を追加するか、.ONESHELL:の下に.SILENT:のオプションを追加して、エコー行を抑制します。

+0

素敵なトリック、私はそこに小さなバグがあると思います、最初の行は と言うべきです.ONESHELL: – Hemeroc

+0

@Hemeroc Fixed。 – Evidlo

関連する問題