2010-04-19 7 views
55

Il comando $ make all restituisce errori come rm: cannot remove '.lambda': No such file or directory quindi si arresta. Voglio che ignori gli errori rm-not-found. Come posso forzare?Marca: come continuare dopo un comando non riesce?

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 '[email protected]\[email protected]\t\&\[email protected]' -e '[email protected][email protected]\t\\\\@g' | tee > .activity_t_lambda > ../RESULTS/currentActivity.tex 

risposta

112

Provare il flag -i (o --ignore-errors). The documentation sembra suggerire un modo più robusto per raggiungere questo obiettivo, tra l'altro:

per ignorare gli errori in una riga di comando, scrivere un - all'inizio del testo della riga (dopo la scheda iniziale). Lo - viene scartato prima che il comando venga passato alla shell per l'esecuzione.

Per esempio,

clean: 
    -rm -f *.o 

Questo fa sì che rm di continuare anche se è in grado di rimuovere un file.

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

+9

+1 - il trattino leader è quello che sembra voler davvero. –

+13

Non * fare * quello! Non dovresti ignorare gli errori.Basta aggiungere il flag -f a rm e non fallirà più quando si tenta di cancellare file che non esistono. Resterà comunque ancora ed errore se davvero non riesce a cancellare un file. Questo è il comportamento che vuoi, fallire quando c'è un problema! –

+3

@Kristof Provost Concordato. 'rm -f' è migliore per il problema specifico che l'utente sta avendo, ma è comunque bello conoscere la soluzione generale anche se a volte non è sicura. –

18

Change pulito per

rm -f .lambda .lambda_t .activity .activity_t_lambda 

Vale a dire non richiedere la rimozione; non lamentarti se il file non esiste.

2

Cambia il tuo modo cleanrm non si lamenterà:

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

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

Dovresti davvero trovare la linea di delimitazione che non funziona e aggiungere un -f ad esso per mantenere comunque questo errore agli altri.

+0

Un voto negativo senza commenti? Classy. –

+1

Non volevo dire nulla, ma mi chiedevo anche cosa ne pensassero. Se c'è qualche motivo per cui non vedo perché quella bandiera non sarebbe appropriata, sarebbe una buona cosa da far apparire. –

+1

Non dovresti ignorare gli errori. La soluzione proposta da Brian, Oded e NebuSoft sono corrette. Questo e la risposta accettata sono sbagliati. –

-1

Inserire un'opzione -f nel comando rm.

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

Il '-' sulla risposta accettata funziona per tutti i comandi –

8

Per ottenere rendere di ignorare in realtà gli errori su una sola riga, si può semplicemente suffisso con ; true, impostando il valore di ritorno a 0. Per esempio:

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

Ciò reindirizzare l'output stderr a null, e segui il comando con vero (che restituisce sempre 0, facendo credere che il comando sia riuscito a prescindere da cosa sia effettivamente accaduto), permettendo al flusso del programma di continuare.

+0

Grazie per il testo dell'errore di dumping. –

+1

Questo funziona per me, in cui il trattino principale non funziona (mi viene fornito un makefile per eseguire un test che deve fallire e analizzerò i log in un secondo momento) –

2

ritorno con successo bloccando rm 's returncode dietro un tubo con il comando true, che restituisce sempre 0 (successo)

rm file | true 
Problemi correlati