Bash

Bash 腳本 - 循環直到返回值為 0

  • June 7, 2013

我需要在我的腳本中解除安裝某些內容,但有時它會在所有數據完成複制之前解除安裝並導致解除安裝失敗。我尋找一種方法來進行“阻塞”解除安裝,但我沒有找到任何東西。所以,我嘗試編寫一個腳本來循環,直到它可以被解除安裝,但它不起作用。

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 mount0,這意味著它已成功解除安裝?

[命令用於評估條件表達式。在這裡沒用。

因為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

引用自:https://unix.stackexchange.com/questions/78512