2009-09-04 6 views
11

J'écris un script bash et j'ai errexit ensemble, de sorte que le script va mourir si une commande ne retourne pas un code de sortie 0, c'est-à-dire si une commande ne se termine pas avec succès. C'est pour s'assurer que mon script bash est robuste.Bash Script - démonte un périphérique, mais n'échoue pas s'il n'est pas monté?

Je dois monter certains systèmes de fichiers, copier certains fichiers, le démonter. Je suis en train de mettre un umount /mnt/temp au début pour qu'il se démonte avant de faire quoi que ce soit. Cependant, s'il n'est pas monté, umount échouera et arrêtera mon script. Est-il possible de faire un umount --dont-fail-if-not-mounted /mnt/temp? Alors qu'il retournera 0 si le périphérique n'est pas monté? Comme rm -f?

Répondre

28

L'astuce standard pour ignorer le code de retour est d'envelopper la commande dans une expression booléenne qui Evalue toujours à la réussite:

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

et redirige la sortie vers/dev/null: umount ...>/dev/null 2> & 1 ||/bin/true – knittl

+0

Eh bien, c'est un peu situationnel. Il est facile d'imaginer un script qui souhaite continuer, mais laisser des messages d'erreur dans le flux de journalisation. –

+6

Vous pouvez rendre ceci un peu plus rapide en utilisant la pseudo-commande ':' (un shell intégré) au lieu de/bin/true (qui crée un nouveau processus). C'est-à-dire, utilisez "' umount .... ||: '" –

5

En supposant que votre umount retourne 1 lorsque l'appareil est pas monté, vous pouvez faire comme ça:

umount … || [ $? -eq 1 ] 

bash assumera aucune erreur si umount renvoie 0 ou 1 (c.-à-démontages avec succès ou dispositif n'est pas monté) mais arrêtera le script si tout autre code est retourné (par exemple, vous n'avez pas autorisations pour démonter le d evice).

+1

J'ai testé et démonté se ferme avec le retour 1 à la fois pour occupé et non monté donc il n'est pas possible de distinguer les deux cas sur la base du code retour seul. –

2

Je viens de trouver le ":" plus utile et je voulais une solution similaire, mais laissez le script savoir ce qui se passe.

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

Cela renvoie la valeur true avec le message, même si l'opération umount a échoué.

+0

La plupart du temps, il est plus utile d'utiliser "/ bin/true" à cet effet, il est alors plus facile de lire et de voir ce que cela signifie. – anydot

+0

Ne sont pas les '{}' et '; : 'redondant ici? J'ai testé 'if false || écho 1; alors écho ok; fi' et la sortie était la même que 'if false || {écho 1; :; } alors écho ok; fi'. – Desty