2010-06-29 13 views
30

Sto creando un Makefile che sposta un file di output (foo.o) in un'altra directory (baz).Come ignorare l'errore mv?

Il file di output si sposta come desiderato nella directory. Tuttavia, poiché make non ricompilare il file di output se si digita nuovamente make, mv riceve un errore quando tenta di spostare il file vuoto inesistente nella directory baz.

Quindi questo è quello che ho definito la mia regola make all dopo tutto la compilazione:

-test -e "foo.o" || mv -f foo.o ../baz 

Purtroppo, sto ancora ricevendo errori.

+1

Guardate cosa ha fatto altendky: -MV foo.o ../baz – Malcolm

risposta

9
[email protected][ -d $(dir [email protected]) ] || mkdir -p $(dir [email protected]) 

è quello che uso per creare una cartella in silenzio, se non esiste. Per il vostro problema qualcosa come questo dovrebbe funzionare

[email protected][ -e "foo.o" ] && mv -f foo.o ../baz 
+0

ho ancora ottengo un errore ignorato quando si utilizza questo, ma era la soluzione migliore finora. grazie – Sam

+0

sì, si otterrà comunque l'errore di ignoranza silenzioso di make, che non sono del tutto d'accordo con @ dovrebbe renderlo completamente silenzioso. – Charles

+0

@ non ha effetto sull'output di make of dal comando, ma dice solo a make di non stampare la chiamata stessa. – JesperE

1
-test -e "foo.o" || if [ -f foo.o ]; then mv -f foo.o ../baz; fi; 

che dovrebbe funzionare

0

Qualcosa di simile

test -e "foo.o" && mv -f foo.o ../baz 

dovrebbe funzionare: l'operatore dovrebbe essere && invece di ||.

Si può sperimentare con questo cercando questi comandi:

test -e testfile && echo "going to move the file" 
test -e testfile || echo "going to move the file" 
27

Ho notato che nessuno ha effettivamente risposto alla domanda iniziale in sé ancora, in particolare come ignorare gli errori (tutte le risposte sono attualmente riguardano solo chiamando il comando se non causerà un errore).

Per ignorare in realtà gli errori, si può semplicemente fare:

mv -f foo.o ../baz 2>/dev/null; true 

Questo reindirizzerà stderr output a null, e seguire il comando con true (che restituisce sempre 0, causando far credere il comando è riuscito a prescindere cosa è successo realmente), permettendo al flusso del programma di continuare.

+3

Questo è buono.Ovviamente qualcuno potrebbe anche abbandonare la parte "vera" e usare "-" se volessero vedere qualche output sul file mancante. –

99

Errors in Recipes (da TFM)

per ignorare gli errori in una linea di ricetta, scrivere un - all'inizio del testo della linea di (dopo la scheda iniziale).

Quindi l'obiettivo sarebbe qualcosa di simile:

moveit: 
    -mv foo.o ../baz