我使用os.Exit(2)
编写了一个简短的Go程序,并从Bash shell运行了该程序。
当我键入echo $?
时,无论传递到1
的退出值如何,它都会显示os.Exit
的值。
下面的Bash脚本与C程序一样显示$?
的{{1}}值。
为什么Go程序始终显示2
的值?我该如何使用1
或0
以外的代码退出,并且应该使用此方法指示不同的退出状态?
1
package main
import "os"
func main() {
os.Exit(2)
}
#!/bin/bash
exit 2
答案 0 :(得分:6)
退出状态1
和0
不是您应用的退出状态,而是go run
的退出状态。
如果您使用go run
运行应用,则如果应用返回go run
退出状态,0
将返回0
,如果应用返回则1
非零状态(或go run
本身失败)。
使用go build
或go install
构建您的应用,然后直接运行您的应用。然后,您将看到2
退出状态。
引用Command go: Compile and run Go program:
Run的退出状态不是已编译二进制文件的退出状态。
注意:如果您在Go playground上运行应用程序,则它还会指示应用程序的退出状态(无输出):
Program exited: status 2.
此“问题”是在之前提出的,请参见#13440。拉斯·考克斯(Russ Cox)的话:
真正的问题是,“ go run x.go”是否应该只是Go程序的解释器,例如“ python x.py”,还是它是运行子进程并报告结果的工具,例如使。迄今为止,答案是后者。因此,除非行为“ go run”被认为是某种交互式的go命令,否则我们看不出该行为是错误的。
Dmitri Shuralyov的话:
退出代码是一维值。执行运行时,可能需要知道两个运行过程和两个退出代码。
但是,go run只能报告一个退出代码值,而不是两个。不可能将两个退出代码无损地组合为一个。如果它报告了逐字运行的程序的退出代码,则有关go run退出代码的信息将被遮盖并有效丢失。
IMO,如果有人在乎所执行程序的确切退出代码,则他们需要构建并自行执行。当您的需求不那么苛刻并且您可以接受较少的信息时,go run是一项便利功能,因为它无法传达比已经存在的更多信息。
答案 1 :(得分:2)
执行程序。例如,
exit.go
:
package main
import "os"
func main() {
os.Exit(2)
}
输出:
$ go build exit.go
$ ./exit
$ echo $?
2
$