Make: come continuare dopo che un comando fallisce?


143

Il comando $ make allfornisce errori come quelli che rm: cannot remove '.lambda': No such file or directorysi interrompe. Voglio che ignori gli errori rm-not-found. Come posso forzare?

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

Risposte:


264

Prova la -ibandiera (o --ignore-errors). La documentazione sembra suggerire un modo più solido per raggiungere questo obiettivo, tra l'altro:

Per ignorare gli errori in una riga di comando, scrivi -a all'inizio del testo della riga (dopo la scheda iniziale). La -viene scartato prima del comando viene passato alla shell per l'esecuzione.

Per esempio,

clean:
  -rm -f *.o

Questo fa sì rmche continui anche se non è possibile rimuovere un file.

Tutti gli esempi sono con rm, ma sono applicabili a qualsiasi altro comando da cui è necessario ignorare gli errori (ad es mkdir.).


30
Non farlo ! Non dovresti ignorare gli errori. Basta aggiungere il flag -f a rm e non fallirà più quando si tenta di eliminare file che non esistono. Restituirà comunque ed errore se non riesce davvero a eliminare un file. Questo è il comportamento che vuoi, fallisci quando c'è un problema!
Kristof Provost,

15
@Kristof Provost concordato. rm -fè migliore per il problema specifico riscontrato dall'utente, ma è comunque utile conoscere la soluzione generale anche se a volte non è sicura.
brian_o,

1
È davvero utile, Eli. Grazie.
Dr Beco,

2
Make fornisce anche $(RM), che è possibile utilizzare al posto di rm -f.
reitermarkus,

32

make -k(o --keep-goingsu gnumake) farà quello che stai chiedendo, credo.

Dovresti davvero trovare la linea del o rm che sta fallendo e aggiungerne una -fper evitare che l'errore accada ad altri.


1
Non volevo dire nulla, ma mi chiedevo anche quale fosse il loro pensiero. Se c'è qualche motivo per cui non vedo perché quella bandiera non sia appropriata, sarebbe una buona cosa far apparire.
TED

3
Non dovresti ignorare gli errori. Le soluzioni proposte da Brian, Oded e NebuSoft sono corrette. Questo e la risposta accettata sono sbagliati.
Kristof Provost,

1
@KristofProvost - Ah. Abbastanza giusto immagino. In generale, credo anche che le risposte alla radice del problema siano superiori a quelle (come questa) che rispondono più o meno alla domanda posta. Non sono sicuro di sottovalutare qualcuno per questo, ma colpi diversi ...
TED

5
Bella risposta. Contiene un semplice indicatore di livello superiore che nessun'altra risposta contiene, ma raccomanda comunque il comportamento corretto. Gli errori non dovrebbero essere ignorati, ma è bene conoscere le opzioni.
brian_o,

1
Qualcosa di utile da fare è ignorare gli errori del compilatore ... che consente makedi creare quante più unità di compilazione possibile mentre si corregge qualunque cosa il compilatore abbia soffocato. In questo modo quando hai risolto tutto ciò che è stato rotto, non devi aspettare che anche tutto il resto venga costruito.
inetknght,

20

Cambia pulito in

rm -f .lambda .lambda_t .activity .activity_t_lambda

Cioè non richiede la rimozione; non lamentarti se il file non esiste.


16

Ritorna con successo bloccando rmil codice di ritorno dietro una pipe con il truecomando, che restituisce sempre 0(successo)

rm file | true

11

Per far in modo che ignori effettivamente gli errori su una singola riga, puoi semplicemente suffissarlo ; true, impostando il valore di ritorno su 0. Ad esempio:

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

Questo reindirizzerà l'output di stderr su null e seguirà il comando con true (che restituisce sempre 0, facendo credere che il comando sia riuscito indipendentemente da ciò che è effettivamente accaduto), consentendo al flusso di programma di continuare.


1
Questo funziona per me dove il trattino iniziale non lo fa (mi viene dato un makefile per eseguire un test che deve fallire e analizzerà i registri in seguito)
Sean Houlihane,

2

Cambia il tuo cleancosì rmnon lamentarti:

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

1

Inserisci -fun'opzione nel tuo rmcomando.

rm -f .lambda .lambda_t .activity .activity_t_lambda
Utilizzando il nostro sito, riconosci di aver letto e compreso le nostre Informativa sui cookie e Informativa sulla privacy.
Licensed under cc by-sa 3.0 with attribution required.