3 回答

TA貢獻1865條經驗 獲得超7個贊
這是一種反模式,因為它引入了復雜性,如果您根本不需要記錄退出狀態,那么就不會存在這種復雜性。
if your_command; then ...
出錯的幾率比
your_command
if [ "$?" -eq 0 ]; then ...
有關可能出錯的示例:考慮陷阱,甚至考慮echo添加用于調試,修改的新語句$?。對于讀者而言,在視覺上并不明顯,your_command在不更改邏輯流程的情況下,單獨運行的一行不能在其下添加任何內容。
那是:
your_command
echo "Finished running your_command" >&2
if [ "$?" -eq 0 ]; then ...
...正在檢查echo,而不是實際命令。
因此,在情況下,你真的做需要應對的方式退出狀態不是馬上在其值是否為零分支更精細的,你應該收集它在同一行:
# 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的內部if聲明,這標志著它作為測試,這樣你的shell不會考慮為目的的非零退出狀態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為已測試的退出狀態,因此不認為它會導致腳本強制退出per set -e。

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