2009-04-19 18 views
10

Sto scrivendo un makefile in bash e ho un obiettivo in cui cerco di trovare se esiste un file e anche se penso che la sintassi sia corretta, ho ancora mi dà un erroreErrore di sintassi: fine del file imprevisto (in attesa di "fi")

Ecco lo script che sto cercando di eseguire

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

sto utilizzando le schede in modo che non è un problema.

L'errore è (quando digito: "fanno leggere")

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

risposta

13

provare ad aggiungere un punto e virgola dopo cat testFile. Ad esempio:

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

alternativamente:

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

la soluzione alternativa funziona ma devo usare la sintassi if..then. l'aggiunta di un punto e virgola non sembra risolvere il problema. – Jaelebi

+0

Strano. L'ho provato la prima volta con il punto e virgola e non ha funzionato. La seconda volta che l'ho eseguito funzionava.Grazie – Jaelebi

+0

Solo una nota a se stessi: originariamente ho scritto semplici istruzioni 'bash' multilinea nel makefile, e ho avuto lo stesso errore - e come questa nota di risposta, il trucco è far riconoscere il makefile il comando shell come una singola riga; quindi avrei bisogno di _both_ punto e virgola ';' (per separare i comandi della shell) _e_ backslash '\\' (per sfuggire alla nuova riga successiva) per farlo funzionare ... Saluti! – sdaau

2

ho conosciuto anche questo problema.

E il motivo è che ho aggiunto alcuni commenti dopo "\".

5

Mi sono imbattuto nello stesso problema. Questo dovrebbe farlo:

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

Dal GNU Make 3.82, è possibile aggiungere .ONESHELL: alla parte superiore del file di raccontare fare per eseguire tutte le linee all'interno di un bersaglio in una singola shell.

.ONESHELL: 
SHELL := /bin/bash 

foobar: 
    if true 
    then 
     echo hello there 
    fi 

Vedere documentation.

Prepend le linee con @ o aggiungere l'opzione .SILENT: sotto .ONESHELL: per sopprimere le linee di eco.

+0

bel trucco, penso che ci sia un piccolo bug in esso, la prima riga dovrebbe dire . ONESHELL: – Hemeroc

+0

@Hemeroc Fisso. – Evidlo

Problemi correlati