
命令行返回值
之前的文章《編寫命令行工具必備知識—Linux終端執行命令后的返回值》講了終端執行命令后會有對應的返回值,這一點非常重要。當在程序中調用系統命令行命令時,可以根據返回值來知道命令執行的結果并執行不同的策略,所以編寫命令行工具時一定要返回對應的狀態碼。
Golang中獲取調用系統命令狀態碼
golang的標準庫os/exec可以用于執行系統命令行命令,舉一個調用系統的cp命令的例子,代碼如下:
err := exec.Command("cp", "./test.go", "../test/test.go").Run()
if err != nil {
println(err.Error())
}
如果沒有copy成功,error信息會輸出執行命令的狀態碼。假如要copy的文件不存在,運行代碼后輸出如下:
$ go run main.go
exit status 1
其中錯誤信息 exit status 1 中的 1 就是執行命令后返回的狀態碼。
Golang編寫命令行程序如何返回狀態碼
可能很多同學都寫過命令行工具,但知道給返回值的同學可能不多。沒有設置返回值的話默認返回值就是0,也就意味著程序即使出錯,從返回值來看依然是執行成功的,這樣就會帶來意想不到的問題。
Golang中可以調用 os.Exit() 方法設置返回狀態碼,先看下官方的注釋:
// Exit causes the current program to exit with the given status code.
// Conventionally, code zero indicates success, non-zero an error.
// The program terminates immediately; deferred functions are not run.
//
// For portability, the status code should be in the range [0, 125].
即:
// Exit 使當前程序停止運行,返回給定的狀態碼。
// 按照慣例,0表示成功,非0表示錯誤。
// 程序立即停止運行;之后的defer函數不再被運行。
//
// 為了可移植性,狀態碼的范圍應該是[0,125]。
看個例子,假如程序檢測到操作系統是macOS時就停止運行,提示不支持當前系統并返回對應的狀態碼2:
package main
import (
"os"
"runtime"
)
func main() {
recode := 0
defer func() { os.Exit(recode) }()
goos := runtime.GOOS
if goos == "darwin" {
recode = 2
println("unsupported platform")
return
}
println("success")
}