2010-06-29 3 views
30

Je crée un Makefile qui déplace un fichier de sortie (foo.o) vers un répertoire différent (baz).Comment faire pour ignorer erreur mv?

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 de nouveau make, mv reçoit une erreur lorsqu'il essaie de déplacer le fichier vide inexistant dans le répertoire baz.

donc ce que je l'ai défini dans ma règle make all après tout compilation:

-test -e "foo.o" || mv -f foo.o ../baz 

Malheureusement, je suis toujours à obtenir des erreurs.

+1

Regardez ce que altendky fait: -mv foo.o ../baz – Malcolm

Répondre

9
[email protected][ -d $(dir [email protected]) ] || mkdir -p $(dir [email protected]) 

est ce que je l'utilise pour créer silencieusement un dossier si elle n'existe pas. Pour votre problème quelque chose comme cela devrait fonctionner

[email protected][ -e "foo.o" ] && mv -f foo.o ../baz 
+0

je reçois encore une erreur ignoré lors de l'utilisation, mais cela était la meilleure solution jusque là. merci – Sam

+0

oui vous obtiendrez toujours l'erreur ignorer silencieuse de faire, que je ne suis pas tout à fait d'accord avec @ devrait le rendre complètement silencieux. – Charles

+0

@ n'affecte pas la sortie de make de la commande, il dit seulement à make de ne pas imprimer l'invocation elle-même. – JesperE

1
-test -e "foo.o" || if [ -f foo.o ]; then mv -f foo.o ../baz; fi; 

Cela devrait fonctionner

0

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 avec cela en essayant ces commandes:

test -e testfile && echo "going to move the file" 
test -e testfile || echo "going to move the file" 
27

Je remarque que personne n'a fait encore répondu à la même question initiale, en particulier comment ignorer les erreurs (toutes les réponses sont actuellement concernés seulement appeler la commande si elle ne causera pas une erreur).

Pour ignorer fait des erreurs, vous pouvez simplement faire:

mv -f foo.o ../baz 2>/dev/null; true 

Cela va rediriger stderr sortie vers null, et suivez la commande avec true (qui retourne toujours 0, ce qui se croire la commande a réussi quel que soit ce qui s'est réellement passé), permettant au flux du programme de continuer.

+3

C'est un bon.Bien sûr, quelqu'un pourrait également supprimer la partie "true" et utiliser "-" s'il voulait voir une sortie sur le fichier manquant. –

99

Errors in Recipes (de TFM)

Pour ignorer les erreurs dans une ligne de recette, écrire un - au début du texte de la ligne (après l'onglet initial).

Ainsi, la cible serait quelque chose comme:

moveit: 
    -mv foo.o ../baz 
Questions connexes