【问题标题】:How do I test for a non-zero exit status of a command in Bash?如何在 Bash 中测试命令的非零退出状态?
【发布时间】:2013-07-03 19:36:28
【问题描述】:

我有一个脚本可以检查以下函数的退出状态:

function is_git_repository {                                                    
    git branch &> /dev/null                                                     
}  

如果您在 git repo 中,则返回 0,如果不在,则返回 128

我测试看看返回值是不是0没有问题;以下按预期工作:

if is_git_repository ; then 
    echo you are in a git repo
else 
    echo you are NOT in a git repo
fi

但是当我遇到问题时,当我尝试测试不是0 的退出状态时。我已经尝试了以下方法,但它们都不起作用:

  1. if [[ "$(is_git_repository)" != "0" ]] ; ... 始终评估为真 (link)
  2. if [[ "$(is_git_repository)" -ne "0" ]] ; ... 总是评估为假
  3. if [[ "$(is_git_repository)" != 0 ]] ; ... 总是评估为真
  4. if [[ "$(is_git_repository)" -ne 0 ]] ; ... 总是评估为假
  5. if [[ ! "$(is_git_repository)" ]] ; ... 总是评估为真
  6. if !is_git_repository ; ... 只是将命令回显给我,但没有爆炸(wtf?)

在 if 语句中检查命令的非零退出状态的正确方法是什么?

【问题讨论】:

  • 你似乎在寻找$?
  • 您链接到的“来源”既不是该问题的已接受答案,也不是该问题的最高投票答案。

标签: bash shell if-statement exit-code


【解决方案1】:

我很快发现if ! is_git_repository ; then ... 可以正常工作(查看Introduction to if 中的7.1.2.1.Testing exit status),但为什么呢?我原以为#1 至少会起作用,但我不知道为什么它不起作用。

另外,#6 怎么了?!

【讨论】:

  • 当您说"$(is_git_repository)" 时,您将返回命令的标准输出,而不是退出状态。您重定向 stdout 和 stderr,因此它始终是始终不等于字符串“0”的空字符串。 bash 对空格敏感,因此! 需要独立存在。正如@devnull 提到的,如果你想要退出状态,你需要$? 变量。
  • @glennjackman 谢谢!这就解释了。 -ne 的那些呢?为什么他们的评估与!= 的评估不同? (即,为什么空字符串“等于”-ne 的“0”/0,但不等于 != 的“0”/0?)
  • 手册的shell arithmetic 部分说:“空值的计算结果为 0。”
  • #6 是历史扩展,仅在交互式 shell 中发生。它会从您的历史记录中打印匹配的命令,然后运行它。
【解决方案2】:

考虑使用布尔快捷方式而不是 if 语句:

is_git_repository || echo you are NOT in a git repo

【讨论】:

    猜你喜欢
    • 2019-11-28
    • 2021-02-15
    • 2017-07-02
    • 1970-01-01
    • 2017-02-22
    • 2019-02-09
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多