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

发布于 2024-09-19 10:08:13 字数 260 浏览 6 评论 0原文

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

package main

import "exec"

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

Isn't this Golang program supposed to output a directory listing to stdout?
It compiles ok, but does nothing.

package main

import "exec"

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

如果你对这篇内容有疑问,欢迎到本站社区发帖提问 参与讨论,获取更多帮助,或者扫码二维码加入 Web 技术交流群。

扫码二维码加入Web技术交流群

发布评论

需要 登录 才能够评论, 你可以免费 注册 一个本站的账号。

评论(4

养猫人 2024-09-26 10:08:13

这有效:

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()
}

this works:

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()
}
别低头,皇冠会掉 2024-09-26 10:08:13

您还可以在本机 go 中使用: 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 软件包。

You could also do it in native go using: ioutil.ReadDir(dir), like so:

//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())
    }
}

Checkout the documentation available for ioutil and os packages.

怕倦 2024-09-26 10:08:13

默认情况下 exec.Command 会将标准输入、输出和错误连接到 /dev/null。因此,您的“ls”命令运行良好,但输出只是被丢弃。 添加: ,那么您的输出将到达您可能期望的位置。

cmd.Stdin = os.Stdin
cmd.Stdout = os.Stdout
cmd.Stderr = os.Stderr

如果您在 exec.Run 调用之前

By default exec.Command will leave standard input, output and error connected to /dev/null. So, your 'ls' command is running fine but the output is just being thrown away. If you add:

cmd.Stdin = os.Stdin
cmd.Stdout = os.Stdout
cmd.Stderr = os.Stderr

before the exec.Run call then your output will go where you probably expect it.

晨敛清荷 2024-09-26 10:08:13

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

exec.Run replaces your program with the one it executes -- it never returns to your app. This means that when 'cd' completes, it will exit as normal, and the only effect should be of changing the directory; 'ls' will never run.

~没有更多了~
我们使用 Cookies 和其他技术来定制您的体验包括您的登录状态等。通过阅读我们的 隐私政策 了解更多相关信息。 单击 接受 或继续使用网站,即表示您同意使用 Cookies 和您的相关数据。
原文