2009-09-04 9 views
11

Sto scrivendo uno script di bash e ho impostato errexit, in modo che lo script morirà se nessun comando non restituisce un codice di uscita 0, ad esempio se un comando non viene completato correttamente. Questo per assicurarsi che il mio script di bash sia solido.Bash Script - smontare un dispositivo, ma non fallire se non è montato?

Devo montare alcuni filesystem, copiare alcuni file, smontarlo. Sto mettendo un umount /mnt/temp all'inizio in modo che lo smonti prima di fare qualsiasi cosa. Tuttavia, se non è montato, umount fallirà e interromperà il mio script.

È possibile fare un umount --dont-fail-if-not-mounted /mnt/temp? In modo che restituisca 0 se il dispositivo non è montato? Mi piace rm -f?

risposta

28

Il trucco standard per ignorare il codice di ritorno è quello di avvolgere il comando in un'espressione booleana che restituisce sempre il successo:

umount .... || /bin/true 
+1

e reindirizzare l'output su/dev/null: umount ...>/dev/null 2> & 1 ||/bin/true – knittl

+0

Beh, questo è un po 'situazionale. È facile immaginare uno script che desideri continuare, ma lasciare tutti i messaggi di errore nel flusso di log. –

+6

Puoi renderlo un po 'più veloce usando lo pseudo-comando ':' (una shell incorporata) invece di/bin/true (che crea un nuovo processo). Cioè, usa "' umount .... ||: '" –

5

Supponendo che i vostri umount restituisce 1 quando il dispositivo non è montato, si può fare in quel modo:

umount … || [ $? -eq 1 ] 

Poi bash non si assume alcuna errore se umount restituisce 0 o 1 (cioè smonta con successo o dispositivo non è montato), ma si arresta lo script se viene restituito qualsiasi altro codice (ad esempio, non si ha autorizzazioni per smontare il d evice).

+1

Ho testato e smusso con il ritorno 1 sia per occupato che non montato, quindi non è possibile distinguere i due casi in base al codice di ritorno. –

2

Ho appena trovato ":" più utile e volevo una soluzione simile, ma ho fatto sapere allo script che cosa stava succedendo.

umount ...... || { echo "umount failed but not to worry" ; : ; } 

Questo restituisce true con il messaggio, sebbene lo smontaggio non sia riuscito.

+0

La maggior parte delle volte è più utile usare "/ bin/true" per questo scopo, è quindi più facile leggere e vedere cosa significa. – anydot

+0

Non sono '{}' e '; : '' ridondante qui? Ho testato 'se falso || echo 1; quindi echo ok; fi' e l'output era lo stesso di 'if false || {echo 1; :; }; quindi echo ok; fi'. – Desty

Problemi correlati