2016-07-18 3 views
1

Я пытаюсь запустить системные команды в golang. Я хочу, чтобы stdout отображался непосредственно на экране. В golang Я использую следующие Сейчас:работающая системная команда в golang как системная команда в perl

out, err := exec.Command(cmd).Output() 
    if err != nil { 
     fmt.Println("error occured") 
     fmt.Printf("%s", err) 
    } 

Здесь я храню выход в «из» переменной, а затем печать, что на экране. Но я хочу что-то, которое печатает как обычную команду оболочки, такую ​​как команда system() в perl.

в Perl:

system("ls -l"); 

Нам не нужно хранить что-либо здесь.

Есть некоторая команда в golang, которая имитирует именно систему() cmd в perl.

ответ

0

Я не вижу какой-либо встроенный в настройках для того, что вы хотите - но функция 7 линия будет достаточно, я считаю:

func system(cmd string, arg ...string) { 
    out, err := exec.Command(cmd, arg...).Output() 
    if err != nil { 
     log.Fatal(err) 
    } 
    fmt.Println(string(out)) 
} 

Тогда вы можете просто назвать его:

system("ls", "-l") 

Таким образом, работая полный пример будет:

package main 

import (
    "fmt" 
    "log" 
    "os/exec" 
) 

func main() { 
    system("ls", "-l") 
} 

func system(cmd string, arg ...string) { 
    out, err := exec.Command(cmd, arg...).Output() 
    if err != nil { 
     log.Fatal(err) 
    } 
    fmt.Println(string(out)) 
} 
+0

Этот буферизует вывод, пока команда не закончит. Это отлично работает, если команда не интерактивна и работает быстро, но для долговременных программ она неудовлетворительна, и это не то же самое, что команда 'system' в perl. –

5

функция Command возвращается в Cmd сек который имеет Stdout поле и другие.
Вы просто должны приложить OS Stdout к Cmd «s Stdout

Пример:

cmd := exec.Command("date") // no need to call Output method here 
cmd.Stdout = os.Stdout // instead use Stdout 
cmd.Stderr = os.Stderr // attach Stderr as well 

err := cmd.Run() 
if err != nil { 
    log.Fatal(err) 
} 

См: Command documentation

+1

, так как он не проверяется, я бы добавил 'os.Stderr' слишком – JimB

+0

@JimB - Спасибо за указание. Я обновил ответ. –