【问题标题】:running system command in golang like system command in perl在 golang 中运行系统命令,如 perl 中的系统命令
【发布时间】:2016-07-18 23:04:57
【问题描述】:

我正在尝试在 golang 中运行系统命令。我希望标准输出直接打印到屏幕上。 在 golang 中,我现在使用以下内容:

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

在这里,我将输出存储到“out”变量中,然后将其打印到屏幕上。但我想要一些像 perl 中的 system() 命令一样打印为普通 shell 命令的东西。

在 perl 中:

system("ls -l");

我们不需要在这里存储任何东西。

golang 中是否有一些命令完全模仿 perl 中的 system() cmd。

【问题讨论】:

    标签: go


    【解决方案1】:

    函数Command 返回具有Stdout 字段的Cmd 结构体。
    您只需将操作系统Stdout 附加到CmdStdout

    例子:

    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

    【讨论】:

    • 因为没有被检查,我也附上os.Stderr
    【解决方案2】:

    我看不到您想要的任何内置选项 - 但我相信 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))
    }
    

    【讨论】:

    • 这会缓冲所有输出,直到命令完成。如果该命令是非交互式且快速运行的,则效果很好,但对于长时间运行的程序来说效果不佳,并且与 perl 中的system 命令不同。
    猜你喜欢
    • 2010-12-17
    • 2021-11-24
    • 2013-06-12
    • 2011-02-12
    • 1970-01-01
    • 2014-03-18
    • 2012-07-03
    • 2013-06-25
    • 2011-10-15
    相关资源
    最近更新 更多