去os.Exit(2)显示bash $?值1

时间:2019-04-17 16:02:36

标签: go exit

我使用os.Exit(2)编写了一个简短的Go程序,并从Bash shell运行了该程序。

当我键入echo $?时,无论传递到1的退出值如何,它都会显示os.Exit的值。

下面的Bash脚本与C程序一样显示$?的{​​{1}}值。

为什么Go程序始终显示2的值?我该如何使用10以外的代码退出,并且应该使用此方法指示不同的退出状态?

1
package main

import "os"

func main() {
    os.Exit(2)
}
#!/bin/bash

exit 2

2 个答案:

答案 0 :(得分:6)

退出状态10不是您应用的退出状态,而是go run的退出状态。

如果您使用go run运行应用,则如果应用返回go run退出状态,0将返回0,如果应用返回则1非零状态(或go run本身失败)。

使用go buildgo 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
$