Shell
為什麼 Unix 命令在 Shell 中以非零值退出並在 bash if 條件中使用時評估為 True?
該命令
patch -R -p0 -s -f --dry-run < abc.patch
失敗,退出程式碼為 1,並從 patch 命令列印一條錯誤消息,但在 if 條件下與否定一起使用時,它通過(即列印 Pass),下面是程式碼if ! patch -R -p0 -s -f --dry-run < abc.patch; then echo "Pass" fi
我試過什麼?我重定向了字元串 dev/null 結果沒有變化
請幫助我了解這裡出了什麼問題?
由於您否定了語句的退出狀態
patch
,因此if
該if
語句可以讀作“如果patch
失敗,則輸出字元串Pass
”。該
if
語句測試給定命令是成功 ( true ) 還是失敗 ( false )。如果您願意,您可以記住這一點並忘記此答案中的其餘部分。當命令失敗時,它的退出狀態是非零的,可能允許更仔細地檢查失敗的原因。如果實用程序為返回的實際值賦予任何含義(例如
curl
,rsync
請參閱手冊的最後部分),腳本可能會選擇適當地處理錯誤。如果命令的退出狀態為零,它會向 shell 發出實用程序成功完成的信號。
退出狀態更多的是“錯誤程式碼”而不是“布爾值”或“真假”。true/false 布爾測試由測試退出狀態的語句在內部執行,
if
以查看實用程序是否存在故障條件。如果不是(退出狀態為零),則測試為true,即實用程序沒有失敗。