【发布时间】: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