我试图想出一种快速且说明性的方法来生成不成功的退出状态,并想到除以零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 somefile
和ls 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
$