exec.Run - 这个Go程序出了什么问题?

时间:2010-09-14 15:04:37

标签: go

这个Golang程序是不是应该将目录列表输出到stdout? 它编译好,但什么都不做。

package main

import "exec"

func main() {
  argv := []string{"-la"}
  envv := []string{}
  exec.Run("ls", argv, envv, "", exec.DevNull, exec.PassThrough, exec.MergeWithStdout)
}

4 个答案:

答案 0 :(得分:4)

这有效:

package main
import "exec"

func main() {
  cmd, err := exec.Run("/bin/ls", []string{"/bin/ls", "-la"}, []string{}, "", exec.DevNull, exec.PassThrough, exec.PassThrough)
  if (err != nil) {
    return
  }
  cmd.Close()
}

答案 1 :(得分:2)

你也可以在本地使用:ioutil.ReadDir(dir),如下所示:

//listdir.go
package main

import (
    "os"
    "io/ioutil"
    "fmt"
)

func ListDir(dir string) ([]os.FileInfo, error) {
    return ioutil.ReadDir(dir)
}

func main() {
    dir := "./"
    if len(os.Args) > 1 {
        dir = os.Args[1]
    }
    fi, err := ListDir(dir)
    if err != nil {
        fmt.Println("Error", err)
    }

    for _, f := range fi {
        d := "-"
        if f.IsDir() { d = "d" }
        fmt.Printf("%s %o %d %s %s\n", d, f.Mode() & 0777, f.Size(), f.ModTime().Format("Jan 2 15:04"), f.Name())
    }
}

查看ioutilos个套件的可用文档。

答案 2 :(得分:1)

默认情况下,exec.Command会将标准输入,输出和错误连接到/ dev / null。所以,你的' ls'命令运行正常但输出正被丢弃。如果你添加:

cmd.Stdin = os.Stdin
cmd.Stdout = os.Stdout
cmd.Stderr = os.Stderr
在exec.Run调用之前

,然后你的输出就会出现在你可能期望的地方。

答案 3 :(得分:-1)

exec.Run将您的程序替换为它执行的程序 - 它永远不会返回到您的应用程序。这意味着当'cd'完成时,它将正常退出,唯一的效果应该是更改目录; 'ls'将永远无法运行。