go語(yǔ)言得到子程序的返回值

go語(yǔ)言調(diào)用外部程序,并獲取外部程序的返回值。

例子1: 程序返回0

$ cat main.go
package main

import (
    "fmt"
    "os/exec"
)

func main() {
    cmd := exec.Command("test.sh")
    err := cmd.Run()
    if err != nil {
        fmt.Printf("Return error: %s\n", err)
    } else {
        fmt.Printf("Return OK\n")
    }
}

$ cat test.sh
#!/bin/bash

echo "Hello"
exit 0

運(yùn)行結(jié)果

$ go build && ./main
Return OK

例子2:程序返回非零

$ cat test.sh
#!/bin/bash

echo "Hello"
exit 2

運(yùn)行結(jié)果

$ go build && ./main
Return error: exit status 2

這里我們看到com.Run()的返回成功還是失敗的區(qū)分是子程序返回值是否為零,其實(shí)在這個(gè)例子中子程序test.sh執(zhí)行是正確的,返回2是希望的行為,但是com.Run()把它定義為錯(cuò)誤,go就這么設(shè)計(jì)的,那就沒(méi)有辦法了,需要注意一下就行了。

例子3:區(qū)分正常的程序返回值,還是異常錯(cuò)誤

例如子程序test.sh不存在,或者test.sh不可執(zhí)行:

$ ./main
Return error: exec: "test.sh": executable file not found in $PATH

或者test.sh 收到異常信號(hào)crash了。

$ ./main
Return error: signal: killed

改造后的main.go


package main

import (
    "fmt"
    "syscall"
    "os/exec"
)

func main() {
    cmd := exec.Command("test.sh")
    err := cmd.Run();

    if err != nil {
        if exitErr, ok := err.(*exec.ExitError); ok {
            status := exitErr.Sys().(syscall.WaitStatus)
            switch {
                case status.Exited():
                    fmt.Printf("Return exit error: exit code=%d\n", status.ExitStatus())
                case status.Signaled():
                    fmt.Printf("Return exit error: signal code=%d\n", status.Signal())
            }
        } else {
            fmt.Printf("Return other error: %s\n", err)
        }
    } else {
        fmt.Printf("Return OK\n")
    }
}

場(chǎng)景1: 正常退出0

$ cat test.sh
#!/bin/bash

echo "Hello"
exit 0
$ ./main
Return OK

子程序正常運(yùn)行結(jié)束,并返回0值。

場(chǎng)景2: 正常退出100

$ cat test.sh
#!/bin/bash

echo "Hello"
exit 100
$ ./main
Return exit error: exit code=100

子程序正常運(yùn)行結(jié)束,并返回100值。

場(chǎng)景3:test.sh不存在或者不可執(zhí)行

$ chmod -x test.sh
$ ./main
Return other error: exec: "test.sh": executable file not found in $PATH

子程序無(wú)法運(yùn)行,我們得到的是其他類型的錯(cuò)誤,而不是exec.ExitError類型錯(cuò)誤。

場(chǎng)景4: test.sh 運(yùn)行中被kill -9

$ cat test.sh
#!/bin/bash

echo "Hello"

sleep 100

exit 100
$ ./main
Return exit error: signal code=9

返回exec.ExitError類型錯(cuò)誤,我們拿到signal值為9

注意在另一個(gè)Terminal中kill掉test.sh
$ kill -9 PID_OF_test.sh

?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請(qǐng)聯(lián)系作者
平臺(tái)聲明:文章內(nèi)容(如有圖片或視頻亦包括在內(nèi))由作者上傳并發(fā)布,文章內(nèi)容僅代表作者本人觀點(diǎn),簡(jiǎn)書(shū)系信息發(fā)布平臺(tái),僅提供信息存儲(chǔ)服務(wù)。

推薦閱讀更多精彩內(nèi)容

  • 想起從前的 快樂(lè)的日子 想到現(xiàn)在的你 并不快樂(lè) 你的快樂(lè) 不再是我的 我多希望 你能一直 一直快樂(lè) ???? 20...
    更向遠(yuǎn)行閱讀 223評(píng)論 0 0
  • 生活往往被現(xiàn)實(shí)打敗,而那些你覺(jué)的變了的人,他們其實(shí)并沒(méi)有改變,而是他們適應(yīng)了現(xiàn)在的生活環(huán)境
    靜靜觀望閱讀 108評(píng)論 0 0
  • 冬天才剛剛走遠(yuǎn),我和妹妹就迫不及待的來(lái)到了這個(gè)世界。妹妹自幼體弱,不好照顧,所以得以留在媽媽身邊,我被好心的姥姥姥...
    六便士__閱讀 476評(píng)論 2 6