我想在Go中执行shell命令,并在程序中将结果输出作为字符串.我看到了Rosetta Code版本:
package main
import "fmt"
import "exec"
func main() {
cmd, err := exec.Run("/bin/ls", []string{"/bin/ls"}, []string{}, "", exec.DevNull, exec.PassThrough, exec.PassThrough)
if (err != nil) {
fmt.Println(err)
return
}
cmd.Close()
Run Code Online (Sandbox Code Playgroud)
但这并没有以我可以以编程方式访问的方式捕获实际标准或错误 - 那些仍然打印到常规stdout/stderr.我看到使用Pipe作为out或err可以帮助其他地方,但没有如何这样做的例子.有任何想法吗?
Lou*_*nco 102
package main
import "os/exec"
import . "fmt"
func main() {
app := "echo"
arg0 := "-e"
arg1 := "Hello world"
arg2 := "\n\tfrom"
arg3 := "golang"
cmd := exec.Command(app, arg0, arg1, arg2, arg3)
stdout, err := cmd.Output()
if err != nil {
Println(err.Error())
return
}
Print(string(stdout))
}
Run Code Online (Sandbox Code Playgroud)
我希望这有帮助!
这个答案并不代表 Go 标准库的当前状态。请查看@Lourenco对最新方法的回答!
您的示例实际上并未从标准输出读取数据。这对我有用。
package main
import (
"fmt"
"exec"
"os"
"bytes"
"io"
)
func main() {
app := "/bin/ls"
cmd, err := exec.Run(app, []string{app, "-l"}, nil, "", exec.DevNull, exec.Pipe, exec.Pipe)
if (err != nil) {
fmt.Fprintln(os.Stderr, err.String())
return
}
var b bytes.Buffer
io.Copy(&b, cmd.Stdout)
fmt.Println(b.String())
cmd.Close()
}
Run Code Online (Sandbox Code Playgroud)
提供的答案均不允许分开stdout
,stderr
因此我尝试另一个答案。
首先,如果您查看软件包中exec.Cmd
类型的文档,则可以获得所需的所有信息os/exec
。看这里:https://golang.org/pkg/os/exec/#Cmd
尤其是成员Stdin
和Stdout
,Stderr
其中的任何成员io.Reader
都可用于提供stdin
新创建的进程的内容,而任何成员io.Writer
均可用于使用stdout
和stderr
命令。
Shellout
以下程序中的函数将运行您的命令,并将其输出和错误输出分别作为字符串传递给您:
package main
import (
"bytes"
"fmt"
"log"
"os/exec"
)
const ShellToUse = "bash"
func Shellout(command string) (error, string, string) {
var stdout bytes.Buffer
var stderr bytes.Buffer
cmd := exec.Command(ShellToUse, "-c", command)
cmd.Stdout = &stdout
cmd.Stderr = &stderr
err := cmd.Run()
return err, stdout.String(), stderr.String()
}
func main() {
err, out, errout := Shellout("ls -ltr")
if err != nil {
log.Printf("error: %v\n", err)
}
fmt.Println("--- stdout ---")
fmt.Println(out)
fmt.Println("--- stderr ---")
fmt.Println(errout)
}
Run Code Online (Sandbox Code Playgroud)
小智 5
// ??exec ??shell= true ?????
func Cmd(cmd string, shell bool) []byte {
if shell {
out, err := exec.Command("bash", "-c", cmd).Output()
if err != nil {
panic("some error found")
}
return out
} else {
out, err := exec.Command(cmd).Output()
if err != nil {
panic("some error found")
}
return out
}
}
Run Code Online (Sandbox Code Playgroud)
你可以试试这个。