exec.Run - Что не так с этой программой Go? - PullRequest
2 голосов
/ 14 сентября 2010

Разве эта программа Golang не должна выводить список каталогов на стандартный вывод? Компилируется нормально, но ничего не делает.

package main

import "exec"

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

Ответы [ 4 ]

4 голосов
/ 14 сентября 2010

это работает:

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()
}
2 голосов
/ 27 августа 2012

Вы также можете сделать это в native 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())
    }
}

Извлечь документацию, доступную для пакетов ioutil и os .

1 голос
/ 29 июля 2014

По умолчанию exec.Command оставляет стандартный ввод, вывод и ошибку подключенными к / dev / null. Итак, ваша команда 'ls' работает нормально, но вывод просто отбрасывается. Если вы добавите:

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

перед вызовом exec.Run, ваш вывод будет идти там, где вы, вероятно, ожидаете.

0 голосов
/ 14 сентября 2010

exec.Run заменяет вашу программу той, которую она выполняет, - она ​​никогда не возвращается в ваше приложение.Это означает, что когда «cd» завершится, он выйдет как обычно, и единственный эффект должен состоять в изменении каталога;'ls' никогда не запустится.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...