为什么bc除以0时会退出0?

为什么bc除以0时会退出0?

我试图想出一种快速且说明性的方法来生成不成功的退出状态,并想到除以零bc将是一个好主意。

我惊讶地发现,虽然它确实生成了运行时错误,但退出状态仍然是 0:

$ echo 41 + 1 | bc
42
$ echo $?
0
$ echo 42/0 | bc
Runtime error (func=(main), adr=6): Divide by zero
$ echo $?
0
  • 为什么 bc 实用程序不会因非零退出状态而失败?

注意:为了快速非零退出状态,我正在使用return 1

另外,从壳尖

$ expr 1 / 0
expr: division by zero
$ echo $?
2

答案1

bc实现的返回状态略有不同,但总体思路是,如果您提供有效输入,则以bc状态 0 退出。42/0是有效输入:没有读取错误,甚至是语法上有效的表达式,因此bc返回 0。如果您通过另一个操作的第二行,bc将执行它。这与其expr目的是评估单个算术表达式不同;这里单个表达式的结果决定了返回状态。

生成指示失败的退出状态的最直接方法是调用false.像这样的事情expr 1 / 0只在混淆的编程竞赛中占有一席之地。

答案2

看看在规格;这是预期的行为。

所有输入都被 正确读取bc,因此它产生退出状态 0。

如果您bc在不存在的文件上运行,例如bc nosuchfile,您将获得一些其他退出状态。


为了说明非零退出状态,我将比较ls somefilels nosuchfile,或者展示退出状态 1 和 2 的常规使用方式(1 表示预期错误或失败状态,2 表示意外错误),如下所示:

$ echo hello > file1
$ echo hello > file2
$ echo goodbye > file3
$ cmp -s file1 file2
$ echo $?
0
$ cmp -s file1 file3
$ echo $?
1
$ cmp -s file1 file4
$ echo $?
2
$ 

相关内容