Bash
Bash 腳本 - 循環直到返回值為 0
我需要在我的腳本中解除安裝某些內容,但有時它會在所有數據完成複制之前解除安裝並導致解除安裝失敗。我尋找一種方法來進行“阻塞”解除安裝,但我沒有找到任何東西。所以,我嘗試編寫一個腳本來循環,直到它可以被解除安裝,但它不起作用。
while [ `sudo umount mount` ] do sleep 0.1 done rmdir mount
執行時輸出:
umount: /home/evantandersen/mount: device is busy. (In some cases useful info about processes that use the device is found by lsof(8) or fuser(1)) rmdir: failed to remove `mount': Device or resource busy
它不應該循環直到返回值為
sudo umount mount
0,這意味著它已成功解除安裝?
該
[
命令用於評估條件表達式。在這裡沒用。因為
umount
在其標準輸出上不輸出任何內容(錯誤轉到 stderr),所以sudo umount mount
擴展為空。所以它就像:
while [ ] do sleep 0.1 done
該
[
命令在沒有傳遞任何參數時[
返回]
false *(*非零退出狀態),因此您不會進入循環。即使
umount
在標準輸出上輸出了錯誤,使用該[
命令也沒有意義,因為該輸出產生的單詞永遠不會構成有效的條件表達式。在這裡你想要:
until sudo umount mount do sleep 0.1 done
也就是說,您要檢查 sudo/umount 的退出狀態,而不是
[
命令的退出狀態。如果您想檢查是否
umount
在其 stderr 上輸出任何錯誤或警告,這[
可能是有用的。-n "some-string"
是命令辨識的條件表達式,用於[
測試是否"some-string"
為空,例如:while [ -n "$(sudo umount mount 2>&1 > /dev/null)" ]; do sleep 0.1 done
但是尋找錯誤或警告消息的存在通常是一個壞主意。該
umount
命令告訴我們它的退出程式碼是否成功,這更可靠。它可以成功並且仍然輸出一些警告資訊。它可能會失敗並且不會輸出錯誤(例如當它被殺死時)。在這種特殊情況下,請注意
umount
可能會因為目錄未掛載而失敗,並且在這種情況下您將永遠循環,因此您可以嘗試另一種方法,例如:while mountpoint -q mount && ! sudo umount mount; do sleep 0.1 done
或者,如果“mount”可能被安裝了多次,而您想將它們全部解除安裝:
while mountpoint -q mount; do sudo umount mount || sleep 0.1 done