177 votes

Make : comment continuer après l'échec d'une commande ?

La commande $ make all donne des erreurs telles que rm: cannot remove '.lambda': No such file or directory alors ça s'arrête. Je veux qu'il ignore les erreurs rm-not-found. Comment puis-je le forcer ?

Makefile

all:
        make clean
        make .lambda
        make .lambda_t
        make .activity
        make .activity_t_lambda
clean:
        rm .lambda .lambda_t .activity .activity_t_lambda

.lambda:
        awk '{printf "%.4f \n", log(2)/log(2.71828183)/$$1}' t_year > .lambda

.lambda_t:
        paste .lambda t_year > .lambda_t

.activity:
        awk '{printf "%.4f \n", $$1*2.71828183^(-$$1*$$2)}' .lambda_t > .activity

.activity_t_lambda:
        paste .activity t_year .lambda  | sed -e 's@\t@\t\&\t@g' -e 's@$$@\t\\\\@g' | tee > .activity_t_lambda > ../RESULTS/currentActivity.tex

329voto

Eli Bendersky Points 82298

Essayez le -i (ou --ignore-errors ). La documentation semble suggérer un moyen plus robuste d'y parvenir, d'ailleurs :

Pour ignorer les erreurs dans une ligne de commande, écrivez une commande - au début du texte de la ligne (après la tabulation initiale). Le site - est rejetée avant que la commande ne soit transmise au shell pour exécution.

Par exemple,

clean:
  -rm -f *.o

Cela provoque rm de continuer même s'il ne parvient pas à supprimer un fichier.

Tous les exemples sont avec rm mais sont applicables à toute autre commande pour laquelle vous avez besoin d'ignorer les erreurs (i.e. mkdir ).

53voto

T.E.D. Points 26829

make -k (ou --keep-going sur gnumake) fera ce que vous demandez, je pense.

Vous devriez vraiment trouver la ligne del ou rm qui échoue et ajouter un -f pour éviter que cette erreur n'arrive à d'autres.

41voto

Azrathud Points 73

Retour réussi en bloquant rm derrière un tuyau avec le code de retour true qui renvoie toujours 0 (succès)

rm file || true

22voto

Brian Carlton Points 2908

Changez le mot "clean" en

rm -f .lambda .lambda_t .activity .activity_t_lambda

C'est-à-dire ne pas demander de supprimer le fichier ; ne pas se plaindre si le fichier n'existe pas.

16voto

Riot Points 618

Pour que make ignore réellement les erreurs sur une seule ligne, vous pouvez simplement la suffixer avec ; true Par exemple, la valeur de retour est de 0 :

rm .lambda .lambda_t .activity .activity_t_lambda 2>/dev/null; true

Cela redirigera la sortie stderr vers null, et suivra la commande avec true (qui renvoie toujours 0, faisant croire à make que la commande a réussi sans tenir compte de ce qui s'est réellement passé), permettant au programme de continuer.

Prograide.com

Prograide est une communauté de développeurs qui cherche à élargir la connaissance de la programmation au-delà de l'anglais.
Pour cela nous avons les plus grands doutes résolus en français et vous pouvez aussi poser vos propres questions ou résoudre celles des autres.

Powered by:

X