假設我用一個函數在if語句:失敗如果條件函數是未定義
if isSomeConditionTrue; then
echo "true";
else
echo "false";
fi
如果isSomeConditionTrue
定義這工作得很好。
但是,如果isSomeConditionTrue
未被定義,例如,由於錯字或缺少導入,它的評估結果爲"false"
,而不是失敗。
set -u
沒有什麼區別。
假設我用一個函數在if語句:失敗如果條件函數是未定義
if isSomeConditionTrue; then
echo "true";
else
echo "false";
fi
如果isSomeConditionTrue
定義這工作得很好。
但是,如果isSomeConditionTrue
未被定義,例如,由於錯字或缺少導入,它的評估結果爲"false"
,而不是失敗。
set -u
沒有什麼區別。
我建議你if
之前插入這樣的:
command_not_found_handle() { false; }
不幸的是,這似乎並不適用於老版本的Bash。 –
這也只是取代127的正常退出狀態,退出狀態爲1.如果使用足夠新的'bash'版本,將'command_not_found_handle'設置爲實際退出* shell可能會有用。 – chepner
最終,你只需要調試腳本,並確保你有適當的進口,不作錯別字。也就是說,有一種方法可以區分一個未定義的命令和一個正常的失敗,儘管它可能不是你想在整個腳本中使用的東西。
isSomeConditionTrue
case $? in
127) echo "Command not found" ;;
0) echo "Command succeeds" ;;
*) echo "Some other problem" ;;
esac
退出狀態127表示找不到命令。 (請注意,這意味着一個性能良好的程序本身不應返回127的狀態;請考慮保留返回值。)
信息豐富,但過於冗長,特別是在組合多個條件函數時。 –
這是一個調試問題;確保定義了「isSomeConditionTrue」。 – chepner