Shell-Script

解除安裝:目標忙於變數

  • September 6, 2019

我想檢查 USB 是否忙並將結果儲存在變數中:

$ foo=$(umount /dev/sdb1)
$ umount: /path/mounted: target is busy.

但是當我想列印時$foo,我得到一個空變數

$ echo $foo
$

我的最終目標是解除安裝 USB。如果目標正忙,則使用 向使用者發出警告whiptail。所以:

$ [[ -z $foo ]] || whiptail --msbox "Cancel the operation that is maintaining your USB busy" 0 0

是否可以將錯誤儲存在target is busy變數上,還是應該使用另一種技術?

程序通常將錯誤消息寫入“標準錯誤”I/O 流;簡稱“stderr”。如果您搜尋該詞,您將獲得數百萬條結果;簡短的解釋是 stderr 存在,因此當“標準輸出”(“stdout”)被重定向時,錯誤消息可以並且將會出現在螢幕上,就像在一個假設的命令中一樣

umount /dev/sdb1 > um.result.txt

你可以看到這種情況發生;即使您試圖在變數中擷取它,錯誤消息也會出現在您的螢幕上。

同樣簡短的答案是用於2>&1 將 stderr 流合併到 stdout 流中,所以

foo=$(umount /dev/sdb1 2>&1)

將擷取變數中的錯誤消息。

jordanm 在評論中建議的另一種方法是查看退出狀態。這個主題的變化包括:

解除安裝 /dev/sdb1 || *向使用者投訴*
如果 !解除安裝 /dev/sdb1
然後
   *向使用者*
fi投訴
解除安裝 /dev/sdb1 2> /dev/null || *向使用者投訴*
foo=$(umount /dev/sdb1 2>&1) || ***使用***“$foo”*向使用者投訴*

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