2009-04-19 6 views
10

J'écris un makefile dans bash et j'ai une cible dans laquelle j'essaie de trouver si un fichier existe et même si je pense que la syntaxe est correcte, je continue me donne une erreur.Erreur de syntaxe: fin de fichier inattendue (s'attendant à "fi")

Voici le script que je suis en train de courir

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

J'utilise des onglets de sorte que n'est pas un problème.

L'erreur est (quand je tape: "faire lire")

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

Répondre

13

Essayez d'ajouter un point-virgule après cat testFile. Par exemple:

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

alternative:

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

la solution alternative fonctionne mais je dois utiliser la syntaxe if..then. l'ajout d'un point-virgule ne semble pas résoudre le problème. – Jaelebi

+0

Bizarre. Je l'ai essayé la première fois avec le point-virgule et cela n'a pas fonctionné. Merci à – Jaelebi

+0

Juste une note à moi-même: J'ai d'abord écrit des instructions 'bash 'multilignes simples dans le fichier makefile, et j'ai eu le même échec - et comme cette note note, l'astuce consiste à faire reconnaître le makefile la commande shell en une seule ligne; donc j'ai besoin de _both_-virgule ';' (pour séparer les commandes shell) _et_ backslash '\\' (pour échapper à la nouvelle ligne suivante) pour que ça marche ... Vive! – sdaau

2

J'ai aussi rencontré ce problème.

Et la raison est que j'ai ajouté quelques commentaires après le "\".

5

J'ai rencontré le même problème. Cela devrait le faire:

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

Depuis GNU Make 3.82, vous pouvez ajouter .ONESHELL: au sommet du fichier à dire faire pour exécuter toutes les lignes dans une cible en une seule coquille.

.ONESHELL: 
SHELL := /bin/bash 

foobar: 
    if true 
    then 
     echo hello there 
    fi 

Voir le documentation.

Ajoute des lignes avec @ ou ajoute l'option .SILENT: sous .ONESHELL: pour supprimer les lignes d'écho.

+0

belle astuce, je pense qu'il y a un petit bug, la première ligne devrait dire .ONESHELL: – Hemeroc

+0

@Hemeroc fixe. – Evidlo

Questions connexes