cmd.exe - интерпретатор команд windows; если вы хотите sh передать ему команду для запуска, вам нужно использовать параметр / c - например, cmd /c dir
. Если вы введете cmd dir
в командной строке, вы получите тот же результат, что и ваше текущее приложение go (за исключением того, что командная строка не будет автоматически закрываться из-за отсутствия стандартного ввода). Если вы запускаете cmd /?
, это объясняется следующим образом:
/ C Выполняет команду, указанную в строке, а затем завершается
. Чтобы исправить ваше приложение, используйте следующее:
cmd = exec.Command("cmd", "/c", "dir")
Альтернативный способ сделать это - передать команду через стандартный ввод:
cmd := exec.Command("cmd")
cmd.Stdout = os.Stdout
stdin, err := cmd.StdinPipe()
if err != nil {
log.Fatal(err)
}
go func() {
defer stdin.Close()
io.WriteString(stdin, "dir\n")
}()
err = cmd.Run()
if err != nil {
log.Fatalf("cmd.Run() failed with %s\n", err)
}
Простой способ открыть файл BMP: cmd = exec.Command("explorer.exe", "test.bmp")
(это откроет его с любым приложением по умолчанию).
Примечание: причина, по которой вам нужно запустить cmd
, в первую очередь в том, что dir
является внутренней командой, предоставляемой cmd.exe
(если вы запустите dir dir.* /s
в папке windows, вы ничего не найдете, потому что нет dir.exe
или подобного; оно встроено в cmd.exe
).
Примечание2: Если вы были запустив ls / dir таким образом, чтобы получить содержимое папки (а не в качестве примера), тогда ioutil.ReadDir - лучший вариант.