【问题标题】:Why I was confused "the exit status code is 0 when a command fails in BASH"为什么我很困惑“当命令在 BASH 中失败时退出状态代码为 0”
【发布时间】:2014-12-27 04:05:18
【问题描述】:

注意:这个问题的问法不正确。原因是条件行if ! ( commad) 中的! 是命令的一部分,因此它会更改$?。所以,当我检查$? 的退出状态command 时,我错了。接受的答案详细解释了这一点。

根据我的编码经验,程序在成功时返回/退出 0,在失败时返回/退出其他值。例如,在 C 语言中,我们使用exit 0 来表示成功终止。但是当我写了一个bash脚本来判断一个命令是否成功时,我觉得很奇怪0现在意味着发生了一些错误并且命令失败了。例如,

if ! (make $1); then
   exit 1
fi

问题为什么在 BASH 中命令失败时退出状态码为 0?

【问题讨论】:

  • 您是在谈论! (make $1) 测试,还是在谈论其他内容? (至于您对scp 的评论,我已经以几种不同的方式运行它失败了,它的退出状态是1)。
  • 简短回答:不是。另一方面,如果您使用! 反转它...
  • scp nosuchbox.example.com:nosuchfile.txt . ; echo $? 为我打印 1。
  • 请记住,因为0 表示成功,if 语句将在退出状态为 0 时分支到 true 侧,并在非零退出状态时转到 else 分支。也许这就是令人困惑的地方?
  • @PengZhang,! 不是if 的一部分;它是正在运行的(复合)命令的一部分,所以是的,它会更改该命令的退出状态。

标签: c bash


【解决方案1】:

在这个问题中提出的主张是错误的; bash 不使用0 表示退出失败。

$ make bad; echo $?
make: *** No rule to make target `bad'.  Stop.
2
$ scp badhost:/something .; echo $?
ssh: Could not resolve hostname badhost: nodename nor servname provided, or not known
1

当然,使用! 来反转失败和成功会产生在失败后使$? 为0 的效果——但这是明确和蓄意的行为。

$ ! make bad; echo $?
make: *** No rule to make target `bad'.  Stop.
0
$ ! scp badhost:/something .; echo $?
ssh: Could not resolve hostname badhost: nodename nor servname provided, or not known
0

【讨论】:

  • "bash 不使用 0 来表示成功退出" - 确实如此,而您刚刚证明了这一点。只是从“C 逻辑”(0=false)的角度思考命令退出状态是错误的。
  • @KarolyHorvath 除了在算术上下文中:if ((0)); then echo "I love ponies"; fi:你不会看到我最喜欢的动物是什么。
  • @KarolyHorvath,……确实如此。 掌心.
  • @gniourf_gniourf:对。并且错误:) 来自手册:((expression)) "如果表达式的值非零,则返回状态为 0;否则返回状态为 1。"
【解决方案2】:

逻辑运算符||&& 的逻辑短路、否定和其他所有内容在两种语言中都是相同的。

唯一的区别是什么代表真(真,成功)和假(假,失败)。

在 C 中,0 是假的,其他一切都是真的。在bash 退出状态上下文中则相反。

if ! (make $1); then

应该读作:如果make $1 失败(= 它没有返回0),那么...

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2022-01-20
    • 1970-01-01
    • 2023-03-31
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多