【问题标题】:is there any way run multiple command "os/exec" in one proccess in golang?有没有办法在golang的一个进程中运行多个命令“os/exec”?
【发布时间】:2018-06-10 08:07:22
【问题描述】:

我想在一个进程中在“os/exec”中运行多个命令,如下所示,“cd”之类的命令不起作用。

func main()  {
cmd := exec.Command("ls")
cmdOutput := &bytes.Buffer{}
cmd.Stdout = cmdOutput
err := cmd.Run()
fmt.Print(string(cmdOutput.Bytes()))

fmt.Println("..........  cd   .........")
cdOutput := &bytes.Buffer{}
cdcomand:=exec.Command("cd","model")
cdcomand.Stdout = cdOutput
err = cdcomand.Run()
fmt.Print(string(cdOutput.Bytes()))
fmt.Println(".......... ls .........")
lsOutput := &bytes.Buffer{}
lscmd:=exec.Command("ls")
lscmd.Stdout = lsOutput

err = lscmd.Run()
if err != nil {
    os.Stderr.WriteString(err.Error())
}
fmt.Print(string(lsOutput.Bytes()))}


我尝试另一种方式:
主包

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

func main()  {
cmd := exec.Command("ls")
cmdOutput := &bytes.Buffer{}
cmd.Stdout = cmdOutput
err := cmd.Run()
fmt.Print(string(cmdOutput.Bytes()))

fmt.Println("..........  cd and ls   .........")
cdOutput := &bytes.Buffer{}
cdcomand:= exec.Command("sh", "-c", "ls && cd model")
cdcomand.Stdout = cdOutput
err = cdcomand.Run()
fmt.Print(string(cdOutput.Bytes()))
fmt.Println(".......... ls .........")
lsOutput := &bytes.Buffer{}
lscmd:=exec.Command("ls")
lscmd.Stdout = lsOutput

err = lscmd.Run()
if err != nil {
    os.Stderr.WriteString(err.Error())
}
fmt.Print(string(lsOutput.Bytes()))
}

它也没有工作。

在 cmd document 中写道:

Cmd 在调用其 Run、Output 或 CombinedOutput 方法后不能被重用。

我已经搜索了所有 tuts 和 docs 以寻找一种方法来做到这一点,但我找不到任何东西。在Executing external commands in Go 文章和advanced command execution in Go with os 中没有解决方案

每个 cmd 命令在不同的进程中执行,所以像“cd”这样的命令不会改变目录。
有没有办法在 golang 的一个进程中运行多个命令“os/exec”?

【问题讨论】:

  • 单个进程可以创建并运行多个Cmd对象。
  • 我找不到任何示例或 tuts 来运行或添加 Cmd 对象来处理 obj,你能举个例子吗?
  • 我熟悉 cmd 对象,我希望所有的 cmd 执行都在同一个进程中运行,我已经更新了我的问题
  • 如果您只想更改目录,请设置Cmd.Dir。否则,运行 shell 以执行来自子进程的多个命令。请注意,shell 将为每个命令启动一个进程。
  • 如何运行 shell:查看此问题的现有答案和stackoverflow.com/questions/34458625

标签: go


【解决方案1】:

是的!

你可以使用sh -c "ls && cd model"

cmd := exec.Command("sh", "-c", "ls && cd model")
cmd.Stdout = &stdout
cmd.Stderr = &stderr
err = cmd.Run()

在 ubuntu 上

$ man sh

DASH(1)                                                              BSD General Commands Manual                                                              DASH(1)

NAME
     dash — command interpreter (shell)

           -c               Read commands from the command_string operand instead of from the standard input.  Special parameter 0 will be set from the command_name
                            operand and the positional parameters ($1, $2, etc.)  set from the remaining argument operands.

使用示例:

$ go version
go version go1.10.2 linux/amd64

// cmd/test/main.go

package main

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


func main() {
        var stdout, stderr bytes.Buffer
        cmd := exec.Command("sh", "-c", "echo 'hello' && echo 'hi'")
        cmd.Stdout = &stdout
        cmd.Stderr = &stderr
        err := cmd.Run()
        fmt.Println(err)
        out := stdout.String() + stderr.String()
        fmt.Printf(out)
}

$ go run cmd/test/main.go
<nil>
hello
hi

【讨论】:

  • 感谢您的回答,我测试了您的解决方案,但没有成功。我在 mac os high sierra 中测试过。
  • @Ali.ZV 你试过什么,怎么没用?你的经历与我的不同,因为它对我有用:)
  • 我的错,它有效并解决了我的其他问题,但不是这个问题......谢谢。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2019-08-17
  • 1970-01-01
  • 2020-10-10
  • 1970-01-01
  • 2021-07-21
相关资源
最近更新 更多