Есть ли способ запустить несколько команд "OS / EXEC" в одном процессе в Голанге? - PullRequest
0 голосов
/ 09 июня 2018

я хочу запустить несколько команд в "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 пишет:

A Cmdне может быть повторно использован после вызова его методов Run, Output или CombinedOutput.

Я искал все документы и документы, чтобы найти способ сделать это, но я не смог ничего найти.не было решения в Выполнение внешних команд в статье Go и расширенное выполнение команд в Go с ОС

каждая команда cmd выполняется в другом процессе, поэтому такие команды как«cd» не изменит каталог.
есть ли способ запустить несколько команд «os / exec» в одном процессе в golang?

1 Ответ

0 голосов
/ 10 июня 2018

Да!

Вы можете использовать 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
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...