2014-02-13 21 views
0

我正在運行一個安裝腳本來在具有GVM的新機器上安裝Grails。GVM在bash腳本中運行時返回錯誤

#!/bin/bash 
set -e 

source "/Users/mecca831/.gvm/bin/gvm-init.sh" 

echo "Install grails" 
gvm install grails 2.1.1 

GVM在這種情況下,它打破我的腳本返回1。但是,如果set -e已刪除,則該腳本可以正常工作。它返回0,並顯示正確的提示。任何人遇到同樣的問題試圖通過GVM安裝Grails?

+0

如果'gvm'在成功操作後返回1,則它是'gvm'錯誤。 – devnull

+0

是的,它似乎是,但我想知道爲什麼它沒有'set -e'返回0。 'set -e'也會傳播給其他腳本嗎? –

+0

試着說'gvm install grails 2.1.1 && echo「exit code 0」||回聲「非零退出代碼」' – devnull

回答

1

非平凡腳本必須專門編寫與set -e一起運行。

gvm-init.sh尚未寫入允許此設置,並且在啓用時會中斷。

例如,考慮this section

GVM_DETECT_HTML="$(echo "$GVM_RESPONSE" | tr '[:upper:]' '[:lower:]' | grep 'html')" 
if [[ -n "$GVM_DETECT_HTML" ]]; then 
    ... 

這是不好的習慣或慶典代碼反正,但它本身的作品不夠好。它找到包含「html」的行,並將它們粘在變量中。然後它檢查變量是否爲空。

但是,如果啓用set -e,腳本將在腳本有機會查看並解釋該變量之前(如果變量將爲空)退出。

在運行任何受影響的代碼之前,您無法對此做任何修改,只需重寫gvm-init.shset +e即可。