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

143

La commande $ make alldonne des erreurs telles que rm: cannot remove '.lambda': No such file or directorysi elle s'arrête. Je veux qu'il ignore les erreurs rm-not-found-errors. Comment puis-je 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
hhh
la source

Réponses:

264

Essayez le -idrapeau (ou --ignore-errors). La documentation semble suggérer un moyen plus robuste d'y parvenir, soit dit en passant:

Pour ignorer les erreurs dans une ligne de commande, écrivez un -au début du texte de la ligne (après l'onglet initial). Le -est ignoré avant que la commande ne soit transmise au shell pour exécution.

Par exemple,

clean:
  -rm -f *.o

Cela provoque rmde continuer même s'il est impossible de supprimer un fichier.

Tous les exemples sont avec rm, mais sont applicables à toute autre commande dont vous devez ignorer les erreurs (ie mkdir).

Eli Bendersky
la source
30
Ne fais pas ça! Vous ne devriez pas ignorer les erreurs. Ajoutez simplement l'indicateur -f à rm et cela n'échouera plus lorsque vous essayez de supprimer des fichiers qui n'existent pas. Cependant, il retournera toujours une erreur s'il ne parvient pas à supprimer un fichier. C'est le comportement que vous voulez, échouez quand il y a un problème!
Kristof Provost
15
@Kristof Provost est d'accord. rm -fest mieux pour le problème spécifique rencontré par l'utilisateur, mais il est toujours bon de connaître la solution générale même si elle est parfois dangereuse.
brian_o
1
C'est vraiment utile, Eli. Je vous remercie.
Dr Beco
2
Make fournit également $(RM), que vous pouvez utiliser à la place de rm -f.
reitermarkus
32

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

Vous devriez vraiment trouver la ligne del ou rm qui échoue et y ajouter un -fpour éviter que cette erreur ne se produise à d'autres.

TED
la source
1
Je ne voulais rien dire, mais je me demandais aussi ce qu'ils pensaient. S'il y a une raison pour laquelle je ne vois pas pourquoi ce drapeau ne serait pas approprié, ce serait une bonne chose à signaler.
TED
3
Vous ne devriez pas ignorer les erreurs. Les solutions proposées par Brian, Oded et NebuSoft sont correctes. Celui-ci et la réponse acceptée sont faux.
Kristof Provost
1
@KristofProvost - Ah. Assez juste je suppose. En général, je pense aussi que les réponses qui vont à la racine du problème sont supérieures à celles (comme celle-ci) qui répondent simplement à la question posée. Je ne suis pas sûr de voter contre quelqu'un pour cela, mais des coups différents ...
TED
5
Bonne réponse. Il contient un indicateur simple de premier niveau qu'aucune autre réponse ne contient, mais recommande toujours le comportement correct. Les erreurs ne doivent pas être ignorées, mais il est bon de connaître les options.
brian_o
1
Une chose utile à faire est d'ignorer les erreurs du compilateur ... ce qui permet makede construire autant d'unités de compilation que possible pendant que vous corrigez ce que le compilateur s'est étouffé. De cette façon, lorsque vous avez corrigé tout ce qui était cassé, vous n'avez pas à attendre que tout le reste soit construit.
inetknght
20

Changer propre en

rm -f .lambda .lambda_t .activity .activity_t_lambda

Ie ne demande pas de suppression; ne vous plaignez pas si le fichier n'existe pas.

Brian Carlton
la source
16

Retour réussi en bloquant rmle code de retour derrière un tube avec la truecommande, qui retourne toujours 0(succès)

rm file | true
Bryce Guinta
la source
11

Pour que make ignore les erreurs sur une seule ligne, vous pouvez simplement le suffixer avec ; true, en définissant la valeur de retour sur 0. Par exemple:

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 retourne toujours 0, faisant croire que la commande a réussi indépendamment de ce qui s'est réellement passé), permettant au programme de continuer.

Émeute
la source
1
Cela fonctionne pour moi là où le tiret principal ne fonctionne pas (on me donne un fichier makefile pour exécuter un test qui doit échouer, et analysera les journaux plus tard)
Sean Houlihane
2

Changez votre cleanpour rmne pas vous plaindre:

clean:
    rm -f .lambda .lambda_t .activity .activity_t_lambda
Oded
la source
1

Mettez une -foption dans votre rmcommande.

rm -f .lambda .lambda_t .activity .activity_t_lambda
NebuSoft
la source