3 回答

TA貢獻1865條經(jīng)驗 獲得超7個贊
這是一種反模式,因為它引入了復雜性,如果您根本不需要記錄退出狀態(tài),那么就不會存在這種復雜性。
if your_command; then ...
出錯的幾率比
your_command
if [ "$?" -eq 0 ]; then ...
有關(guān)可能出錯的示例:考慮陷阱,甚至考慮echo添加用于調(diào)試,修改的新語句$?。對于讀者而言,在視覺上并不明顯,your_command在不更改邏輯流程的情況下,單獨運行的一行不能在其下添加任何內(nèi)容。
那是:
your_command
echo "Finished running your_command" >&2
if [ "$?" -eq 0 ]; then ...
...正在檢查echo,而不是實際命令。
因此,在情況下,你真的做需要應對的方式退出狀態(tài)不是馬上在其值是否為零分支更精細的,你應該收集它在同一行:
# whitelisting a nonzero value for an example of when "if your_command" won't do.
your_command; your_command_retval=$?
echo "Finished running your_command" >&2 ## now, adding more logging won't break the logic.
case $your_command_retval in
0|2) echo "your_command exited in an acceptable way" >&2;;
*) echo "your_command exited in an unacceptable way" >&2;;
esac
最后:如果您附上your_command的內(nèi)部if聲明,這標志著它作為測試,這樣你的shell不會考慮為目的的非零退出狀態(tài)set -e或ERR陷阱。
從而:
set -e
your_command
if [ "$?" -eq 0 ]; then ...
...將永遠不會(除非有許多困擾set -e行為的極端情況和警告)if以$?除以外的其他任何值到達該語句0,因為set -e在這種情況下將強制退出。相比之下:
set -e
if your_command; then ...
...將標記your_command為已測試的退出狀態(tài),因此不認為它會導致腳本強制退出per set -e。

TA貢獻1943條經(jīng)驗 獲得超7個贊
“通常無效”是該定義中經(jīng)過深思熟慮的組成部分。如果有一種最佳實踐替代方案可以解決主要陷阱或警告,而又沒有任何負面折衷,則某些事情可能在超過50%的時間工作時成為反模式。確實,一些反模式之類的東西之所以如此,是因為它們帶來了安全風險。一個安全漏洞只需要利用一次就可以使具有該漏洞的代碼不可接受,而不是超過50%的執(zhí)行。

TA貢獻1757條經(jīng)驗 獲得超8個贊
經(jīng)過這么多年的軟件編寫,除了在早期開發(fā)工作中我對調(diào)試用輸出感興趣的情況下,我不會使用錯誤的格式。如前所述,不要增加不必要的復雜性。
添加回答
舉報