2009-09-04 16 views
11

Ich schreibe ein Bash-Skript und ich habe errexit gesetzt, so dass das Skript stirbt, wenn ein Befehl keinen 0 Exit-Code zurückgibt, d. H. Wenn ein Befehl nicht erfolgreich abgeschlossen wird. Dies ist um sicherzustellen, dass mein Bash-Skript robust ist.Bash Script - umount ein Gerät, aber nicht fehlschlagen, wenn es nicht gemountet ist?

Ich muss einige Dateisysteme mounten, einige Dateien kopieren, umount es. Ich setze eine umount /mnt/temp am Anfang, so dass es umount wird, bevor Sie etwas tun. Wenn es jedoch nicht gemountet ist, schlägt umount fehl und stoppt mein Skript.

Ist es möglich, eine umount --dont-fail-if-not-mounted /mnt/temp zu tun? So dass es 0 zurückgibt, wenn das Gerät nicht montiert ist? Wie rm -f?

Antwort

28

Der Standard Trick des Return-Code zu ignorieren den Befehl in einem Booleschen Ausdruck wickeln, die den Erfolg ergibt immer:

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

und die Ausgabe an/dev/null umleiten: umount ...>/dev/null 2> & 1 ||/bin/true – knittl

+0

Nun, das ist irgendwie situationsbedingt. Es ist leicht vorstellbar, dass ein Skript fortfahren möchte, aber Fehlermeldungen im Protokolldatenstrom bleiben. –

+6

Sie können dies etwas schneller machen, indem Sie den Pseudobefehl ':' (eine eingebaute Shell) anstelle von/bin/true verwenden (wodurch ein neuer Prozess erstellt wird). Das heißt, verwenden Sie "' umount .... ||: '" –

5

Unter der Annahme, dass Ihre umount gibt 1 zurück, wenn das Gerät nicht montiert ist, die Sie tun können es wie folgt aus:

umount … || [ $? -eq 1 ] 

Dann bash wird kein Fehler übernehmen, wenn umount liefert 0 oder 1 (dh Aushänge erfolgreich oder Gerät nicht montiert ist), sondern wird das Skript zu stoppen, wenn ein anderer Code zurückgegeben wird (zB Sie haben keine Berechtigungen zum Deaktivieren der d Gerät).

+1

Ich getestet und umounts quit mit Rückgabe 1 sowohl für beschäftigt und nicht montiert, so dass es nicht möglich ist, die beiden Fälle auf der Basis von Return-Code allein zu unterscheiden. –

2

Ich fand nur das ":" nützlicher und wollte eine ähnliche Lösung, aber lassen Sie das Skript wissen, was passiert.

Dies gibt True mit der Nachricht zurück, obwohl der Umount fehlgeschlagen ist.

+0

Meistens ist es sinnvoller, zu diesem Zweck "/ bin/true" zu verwenden, es ist dann einfacher zu lesen und zu sehen, was es bedeutet. – anydot

+0

Sind nicht die '{}' und '; :; "Redundant hier? Ich testete 'wenn falsch || Echo 1; dann echo ok; fi' und die Ausgabe war die gleiche wie 'if false || {Echo 1; :; }; dann echo ok; fi'. – Desty