Je crée un Makefile qui déplace un fichier de sortie (foo.o
) vers un répertoire différent (baz
).
Le fichier de sortie se déplace comme souhaité dans le répertoire. Cependant, puisque make ne recompilera pas le fichier de sortie si je tape à nouveau make
, mv
obtient une erreur lorsqu'il essaie de déplacer le fichier vide inexistant vers le répertoire baz
.
Voici donc ce que j'ai défini dans ma règle make all
après toute compilation:
-test -e "foo.o" || mv -f foo.o ../baz
Malheureusement, je reçois toujours des erreurs.
+@[ -d $(dir $@) ] || mkdir -p $(dir $@)
est ce que j'utilise pour créer silencieusement un dossier s'il n'existe pas. Pour votre problème, quelque chose comme ça devrait fonctionner
-@[ -e "foo.o" ] && mv -f foo.o ../baz
Erreurs dans les recettes (de TFM)
Pour ignorer les erreurs dans une ligne de recette, écrivez un
-
au début du texte de la ligne (après l'onglet initial).
Donc, la cible serait quelque chose comme:
moveit:
-mv foo.o ../baz
Je remarque que personne n'a encore répondu à la question d'origine elle-même, en particulier comment ignorer les erreurs (toutes les réponses concernent actuellement uniquement l'appel de la commande si elle ne provoque pas d'erreur).
Pour ignorer réellement les erreurs, vous pouvez simplement faire:
mv -f foo.o ../baz 2>/dev/null; true
Cela redirigera la sortie de stderr
vers null
et suivra la commande avec true
(qui renvoie toujours 0
, faisant croire à la commande que la commande a réussi indépendamment de ce qui s'est réellement passé), permettant au flux de programme de continuer.
-test -e "foo.o" || if [ -f foo.o ]; then mv -f foo.o ../baz; fi;
Cela devrait fonctionner
Quelque chose comme
test -e "foo.o" && mv -f foo.o ../baz
devrait fonctionner: l'opérateur doit être &&
au lieu de ||
.
Vous pouvez expérimenter cela en essayant ces commandes:
test -e testfile && echo "going to move the file"
test -e testfile || echo "going to move the file"