2012-01-30 67 views
2

我在Archlinux的mkinitcpio腳本中發現了下面的代碼片段。

cleanup() { 
    if [[ $workdir ]]; then 
     # when PRESET is set, we're in the main loop, not a worker process 
     if ((SAVELIST)) && [[ -z $PRESET ]]; then 
      msg "build directory saved in %s" "$workdir"                               
     else 
      rm -rf "$workdir" 
     fi 
    fi 

    exit ${1:0} 
} 

是在exit ${1:0}這裏多餘的?爲什麼不只是簡單地寫exit $1。我用諸如1,-1,130這樣的參數測試了這個函數,簡單版本和複雜版本沒有區別。

回答

2

這允許它在沒有參數(或空字符串參數)的情況下使用並導致exit 0。這與單獨使用exit不同,因爲exit單獨使用上一個命令的退出狀態。即使msgrm預計不會導致0以外的狀態,這可以避免作者在更改代碼時不得不考慮此問題。

2

就目前而言,由於從索引0得到的變量的子字符串是......以及相同的值,所以似乎是多餘的。但是,要退出的空字符串與exit 0相同。現在,如果它是exit ${1:-0}它將是非常有意義的 - 那麼0(成功)將是默認退出值,並且將在沒有參數$1的情況下使用。但是,顯式傳遞0不是必需的。

+0

是的,我知道退出$ {1:-0}的技巧,它將零作爲默認退出值。但是這個是如此不同。 – 2012-01-30 14:31:13

0

要添加到其他的答案:這是在這種情況下多餘的,因爲exit不帶任何參數將有方式exit 0相同。因此exit $1exit ${1:-0}實際上是相同的。