2009-09-04 63 views
11

我寫了一個bash腳本,並且設置了errexit,這樣如果任何命令沒有返回0退出代碼,即任何命令沒有成功完成,腳本將會死亡。這是爲了確保我的bash腳本是健壯的。Bash腳本 - 卸載設備,但是如果沒有安裝,請不要失敗?

我必須裝載一些文件系統,複製一些文件,然後卸載它。我在開始時會放入一個umount /mnt/temp,以便在做任何事情之前將其卸載。但是如果它沒有安裝,那麼umount會失敗並停止我的腳本。

是否可以做umount --dont-fail-if-not-mounted /mnt/temp?如果設備沒有安裝,它會返回0。像rm -f

回答

28

標準的把戲忽略返回代碼是一個布爾表達式,結果總是成功的包裝命令:

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

並將輸出重定向到/ dev/null:umount ...>/dev/null 2>&1 ||/bin/true – knittl 2009-09-04 10:22:20

+0

那麼,這是一個情境。很容易想象腳本想要繼續,但在日誌流中留下任何錯誤消息。 – 2009-09-04 10:44:17

+6

通過使用僞命令':'(shell內置)而不是/ bin/true(它創建一個新進程),可以使其更快一些。也就是說,使用「'umount .... ||:'」 – 2009-09-05 08:34:19

5

假設你umount返回1時,未安裝設備,你可以做它像:

umount … || [ $? -eq 1 ] 

然後bash將不承擔任何錯誤,如果umount返回0或1(即成功卸除或設備未安裝),但將停止腳本如果返回任何其他代碼(例如,你有沒有卸載d的權限evice)。

+1

我測試了umount退出,返回1都用於繁忙和未安裝,因此無法單獨根據返回碼來區分這兩種情況。 – 2015-05-29 18:41:48

2

我剛剛發現「:」更有用,並希望有類似的解決方案,但讓腳本知道發生了什麼。

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

雖然umount失敗,但是這個消息返回true。

+0

大多數情況下,爲了這個目的使用「/ bin/true」會更有用,因此讀起來更容易,看看它是什麼意思。 – anydot 2012-10-20 13:48:36

+0

不是'{}'和'; :''在這裏多餘? 我測試過'如果false ||回聲1;然後回聲確定; fi',輸出和'if false ||'一樣{echo 1; :; };然後回聲確定; fi'。 – Desty 2014-10-15 14:37:10