为了账号安全,请及时绑定邮箱和手机立即绑定

如何在Go中传递多个命令?

/ 猿问

如何在Go中传递多个命令?

Go
30秒到达战场 2019-11-14 09:52:31

如何在Go中将多个外部命令传递到一起?我已经试过了这段代码,但是看到一条错误消息exit status 1。


package main


import (

    "io"

    "log"

    "os"

    "os/exec"

)


func main() {

    c1 := exec.Command("ls")

    stdout1, err := c1.StdoutPipe()

    if err != nil {

        log.Fatal(err)

    }


    if err = c1.Start(); err != nil {

        log.Fatal(err)

    }

    if err = c1.Wait(); err != nil {

        log.Fatal(err)

    }


    c2 := exec.Command("wc", "-l")

    c2.Stdin = stdout1


    stdout2, err := c2.StdoutPipe()

    if err != nil {

        log.Fatal(err)

    }


    if err = c2.Start(); err != nil {

        log.Fatal(err)

    }

    if err = c2.Wait(); err != nil {

        log.Fatal(err)

    }


    io.Copy(os.Stdout, stdout2)

}


查看完整描述

3 回答

?
慕婉清6462132

StdoutPipe返回一个管道,该管道将在命令启动时连接到命令的标准输出。在Wait看到命令退出后,管道将自动关闭。


(来自http://golang.org/pkg/os/exec/#Cmd.StdinPipe)


您确实c1.Wait关闭了事实stdoutPipe。


我做了一个工作示例(只是一个演示,添加了错误捕获功能!):


package main


import (

    "bytes"

    "io"

    "os"

    "os/exec"

)


func main() {

    c1 := exec.Command("ls")

    c2 := exec.Command("wc", "-l")


    r, w := io.Pipe() 

    c1.Stdout = w

    c2.Stdin = r


    var b2 bytes.Buffer

    c2.Stdout = &b2


    c1.Start()

    c2.Start()

    c1.Wait()

    w.Close()

    c2.Wait()

    io.Copy(os.Stdout, &b2)

}


查看完整回答
反对 回复 2019-11-14
?
慕码人2483693

对于简单的情况,可以使用以下方法:


bash -c "echo 'your command goes here'"


例如,此函数使用管道命令检索CPU型号名称:


func getCPUmodel() string {

        cmd := "cat /proc/cpuinfo | egrep '^model name' | uniq | awk '{print substr($0, index($0,$4))}'"

        out, err := exec.Command("bash","-c",cmd).Output()

        if err != nil {

                return fmt.Sprintf("Failed to execute command: %s", cmd)

        }

        return string(out)

}


查看完整回答
反对 回复 2019-11-14
?
交互式爱情

package main


import (

    "os"

    "os/exec"

)


func main() {

    c1 := exec.Command("ls")

    c2 := exec.Command("wc", "-l")

    c2.Stdin, _ = c1.StdoutPipe()

    c2.Stdout = os.Stdout

    _ = c2.Start()

    _ = c1.Run()

    _ = c2.Wait()

}


查看完整回答
反对 回复 2019-11-14

添加回答

回复

举报

0/150
提交
取消
意见反馈 帮助中心 APP下载
官方微信