Bash

同時檢查空輸出和成功退出狀態

  • June 20, 2015

我想在安裝程序腳本1中編寫以下測試:

if [ -n "`/etc/grub.d/30_os-prober`" ]; then
   install_dual_boot
else
   install_linux_only
fi

但是,也有可能30_os-prober沒有輸出,因為它以某種方式未能完成。如果30_os-prober以非零退出狀態失敗,則假設雙引導情況會更安全。

如何檢查是否成功30_os-prober沒有輸出?

基本上,我想獲得類似於……的效果。

if [ -n "`/etc/grub.d/30_os-prober`" ]; then
   # Do stuff for a dual-boot machine
   install_dual_boot
elif ! /etc/grub.d/30_os-prober >/dev/null; then
   # OS probe failed; assume dual boot out of abundance of caution
   install_dual_boot
else
   install_linux_only
fi

…但沒有兩次執行相同的命令。


1背景資訊:30_os-prober附帶GRUB2,我正在編寫的腳本是我為FAI自定義配置的一部分。

首先,雖然它們在功能上是等價的,但 $(…)被廣泛認為比——參見thisthisthis更清晰。其次,您不需要使用$?來檢查命令是成功還是失敗。我最近被吸引到第 2.9.1 節, Shell 和實用程序 的開放組基本規範的簡單命令(第 7 期) :

“簡單命令”是一系列可選的變數分配和重定向,以任何順序,可選地後跟單詞和重定向,由控制運算符終止。

當需要執行給定的簡單命令時……

                          ⋮                                                                                (等等,等等,等等……)

如果有命令名稱,則應按照命令搜尋和執行中的說明繼續執行。如果沒有命令名稱,但該命令包含命令替換,則該命令應以執行的最後一個命令替換的退出狀態完成。…

例如,

  • 命令的退出狀態
ls -ld "module_$(uname).c"

是 的退出狀態ls,但是

  • 命令的退出狀態
myfile="module_$(uname).c"

是 的退出狀態uname

所以ferada的回答可以簡化一點:

如果輸出=$(/etc/grub.d/30_os-prober) && [ -z "$output" ]
# 即,如果**30_os-prober** *成功*產生無輸出
然後
install_linux_only
別的
install_dual_boot
是

請注意,僅對環境變數(或在整個腳本中可見的變數)使用全大寫名稱是一種很好的做法。有限範圍的變數通常以小寫命名(或者,如果您願意,也可以使用 camelCase)。

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