Shell

為什麼 Unix 命令在 Shell 中以非零值退出並在 bash if 條件中使用時評估為 True?

  • December 22, 2021

該命令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,因此ifif語句可以讀作“如果patch失敗,則輸出字元串Pass”。

if語句測試給定命令是成功 ( true ) 還是失敗 ( false )。如果您願意,您可以記住這一點並忘記此答案中的其餘部分。

當命令失敗時,它的退出狀態是非零的,可能允許更仔細地檢查失敗的原因。如果實用程序為返回的實際值賦予任何含義(例如curlrsync請參閱手冊的最後部分),腳本可能會選擇適當地處理錯誤。

如果命令的退出狀態為零,它會向 shell 發出實用程序成功完成的信號。

退出狀態更多的是“錯誤程式碼”而不是“布爾值”或“真假”。true/false 布爾測試由測試退出狀態的語句在內部執行,if以查看實用程序是否存在故障條件。如果不是(退出狀態為零),則測試為true,即實用程序沒有失敗。

引用自:https://unix.stackexchange.com/questions/683438