web-dev-qa-db-fra.com

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 donc ça s'arrête. Je veux qu'il ignore les erreurs rm-not-found-. 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
124
hhh

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

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

Par exemple,

clean:
  -rm -f *.o

Ceci entraîne la poursuite de rm même s'il est impossible de supprimer un fichier.

Tous les exemples concernent rm, mais s’appliquent à toute autre commande dont vous devez ignorer les erreurs (par exemple, mkdir).

223
Eli Bendersky

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

Vous devez vraiment trouver la ligne del ou rm qui échoue et ajouter un -f pour empêcher cette erreur d’arriver à d’autres.

30
T.E.D.

Changer propre à

rm -f .lambda .lambda_t .activity .activity_t_lambda

C'est à dire. ne pas demander pour supprimer; ne vous plaignez pas si le fichier n'existe pas.

19
Brian Carlton

Pour que make ignore réellement les erreurs sur une seule ligne, vous pouvez simplement y ajouter le suffixe ; 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 de stderr vers null et suivra la commande avec true (qui renvoie toujours 0, laissant croire à la réussite de la commande, peu importe ce qui s'est réellement passé), permettant ainsi au flux de programme de continuer.

11
Riot

Retournez avec succès en bloquant le code retour de rm derrière un tube avec la commande true, qui renvoie toujours 0 (Succès)

rm file | true
10
Bryce Guinta

Changez votre clean pour que rm ne se plaint pas:

clean:
    rm -f .lambda .lambda_t .activity .activity_t_lambda
2
Oded

Mettez une option -f Dans votre commande rm.

rm -f .lambda .lambda_t .activity .activity_t_lambda
0
NebuSoft