Dans la section propre de mon Makefile
, j'essaie de vérifier si le fichier existe avant de le supprimer définitivement. J'utilise ce code mais je reçois des erreurs.
Qu'est ce qui ne va pas avec ça?
if [ -a myApp ]
then
rm myApp
fi
Je reçois ce message d'erreur
if [ -a myApp ]
/bin/sh: Syntax error: end of file unexpected (expecting "then")
make: *** [clean] Error 2
rm -rf myApp
pourrait être une alternative. Ou précéder la commande d'un tiret (-rm myApp
) pour faire ignorer l'erreur de rm (il affichera cependant un message moche).Réponses:
La deuxième réponse en haut mentionne
ifeq
, cependant, elle ne mentionne pas que ceux-ci doivent être au même niveau que le nom de la cible, par exemple, pour télécharger un fichier uniquement s'il n'existe pas actuellement, le code suivant pourrait être utilisé:la source
C'est étrange de voir autant de gens utiliser des scripts shell pour cela. Je cherchais un moyen d'utiliser la syntaxe native makefile, car j'écris ceci en dehors de toute cible. Vous pouvez utiliser la
wildcard
fonction pour vérifier si le fichier existe:Mettre à jour:
J'ai trouvé un moyen qui fonctionne vraiment pour moi:
la source
Makefile:133: *** unterminated call to function `wildcard': missing `)'. Stop.
$(wildcard pattern)
fait réellement. Voir le lien .FILE_EXISTS := $(or $(and $(wildcard $(PATH_TO_FILE)),1),0)
Le problème est lorsque vous divisez votre commande sur plusieurs lignes. Ainsi, vous pouvez soit utiliser la
\
fin des lignes pour la suite comme ci-dessus, soit tout obtenir sur une seule ligne avec l'&&
opérateur dans bash.Ensuite, vous pouvez utiliser une
test
commande pour tester si le fichier existe, par exemple:ou ne:
Le
test
équivaut à la[
commande.et cela fonctionnerait comme dans votre exemple original.
Voir:
help [
ouhelp test
pour plus de syntaxe.la source
-s
s'agit d'un cas particulierexists and has a size greater than zero
. La question telle qu'elle est écrite est indépendante de la taille, donc l'existence doit être vérifiée en utilisanttest -e
pour un fichier ou-d
pour un répertoire. Les fichiers vides peuvent être particulièrement utiles en tant qu'indicateurs / sentinelles (faute d'un meilleur terme), ce qui pourrait être tout à fait pertinent pourmake
.-f
par défaut, car il est plus courant à utiliser.test
à Windows?|| true
à la fin afin que la commande retourne true lorsque le fichier n'existe pas.test -f myApp || CMD
, notez le||
, donc si-f
échouera - n'existe pas (||
), puis exécutez la commande. Est-ce que ça fait du sens?Il peut avoir besoin d'une barre oblique inverse à la fin de la ligne pour la suite (bien que cela dépende peut-être de la version de make):
la source
make
une nouvelle ligne serait une nouvelle commande bash. La mise en garde principale de ceci, autre que le désagrément d'avoir beaucoup\
à la fin des lignes est que chaque commande doit se terminer par le;
qui serait autrement implicite dans bash.Ou mettez-le simplement sur une seule ligne, comme vous l'
make
aimez:la source
Manque un point-virgule
Cependant, je suppose que vous vérifiez l'existence avant la suppression pour éviter un message d'erreur. Si tel est le cas, vous pouvez simplement utiliser la
rm -f myApp
suppression qui "force", c'est-à-dire ne pas se tromper si le fichier n'existait pas.la source
résultats d'exécution:
la source
echo -n yes
le succès detest
dans la chaîneyes
sans NL. Leifeq
peut alors le comparer avec le codé en duryes
. Tout cela parce queifeq
veut une chaîne à comparer, pas un statut de réussite d'une commande shell.Solution une ligne:
Solution en une ligne avec action d'erreur:
Exemple utilisé dans mes
make clean
directives:Et
make clean
fonctionne toujours sans aucun message d'erreur!la source
-rm myfile
le tiret principal indiquant à faire d'ignorer toute erreur.@[ -f 'myfile' ] && rm myfile
"Si README.md n'existe pas, ne faites rien (et quittez avec succès). Sinon, ajoutez du texte à la fin."
Si vous utilisez à la
&&
place de,||
vous générez une erreur lorsque le fichier n'existe pas:la source
J'essayais:
Et le cas positif a fonctionné mais mon shell ubuntu bash appelle cela VRAI et se brise sur la copie:
Après avoir obtenu cette erreur, je cherche sur Google comment vérifier si un fichier existe dans make, et c'est la réponse ...
la source
Cette solution publiée ci-dessus fonctionne le mieux. Mais assurez-vous que vous ne stringify pas l'affectation PATH_TO_FILE Par exemple,
Ce doit être
la source
Les réponses comme celle de @ mark-wilkins utilisant \ pour continuer les lignes et; les terminer dans le shell ou comme ceux de @kenorb en changeant cela en une seule ligne sont bons et résoudront ce problème.
il existe une réponse plus simple au problème d'origine (comme l'a souligné @ alexey-polonsky). Utilisez l'indicateur -f pour rm afin qu'il ne déclenche pas d'erreur
c'est plus simple, plus rapide et plus fiable. Faites juste attention à ne pas vous retrouver avec une barre oblique et une variable vide
rm -f / $ (myAppPath)#NE JAMAIS FAIRE CELAvous pourriez finir par supprimer votre système.
la source
rm
du tout; BTW, je suis à peu près sûr querm -f /$(myAppPath)
cela ne causera aucun dommage non plus, car il/
s'agit d'un répertoire et qu'il-r
manque.rm -f
, par exemple, il peut vouloirrm
une variable.