首页
学习
活动
专区
工具
TVP
发布
社区首页 >问答首页 >在golang中有没有办法在一个进程中运行多个命令"os/exec“?

在golang中有没有办法在一个进程中运行多个命令"os/exec“?
EN

Stack Overflow用户
提问于 2018-06-10 02:07:09
回答 1查看 2.9K关注 0票数 0

我想在一个进程中运行"os/exec“中的多个命令,正如你在下面看到的,像"cd”这样的命令不起作用。

代码语言:javascript
复制
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()))}

我尝试了另一种方法:

代码语言:javascript
复制
 package main
代码语言:javascript
复制
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()))
}

它也不起作用。

在命令中,document写道:

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

我已经搜索了所有的but和文档来寻找这样做的方法,但是我没有找到任何东西。在Executing external commands in Go文章和advanced command execution in Go with os中没有解决方案

每个cmd命令在不同进程中执行,因此像"cd“这样的命令不会更改目录。

在golang中有没有办法在一个进程中运行多个命令"os/exec“?

EN

回答 1

Stack Overflow用户

发布于 2018-06-10 05:53:19

是!

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

代码语言:javascript
复制
cmd := exec.Command("sh", "-c", "ls && cd model")
cmd.Stdout = &stdout
cmd.Stderr = &stderr
err = cmd.Run()

在ubuntu上

代码语言:javascript
复制
$ 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.

下面是使用以下命令的示例:

代码语言:javascript
复制
$ go version
go version go1.10.2 linux/amd64

代码语言:javascript
复制
// 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)
}

代码语言:javascript
复制
$ go run cmd/test/main.go
<nil>
hello
hi
票数 3
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/50777163

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档