【问题标题】:Echo command in GolangGolang 中的回显命令
【发布时间】:2016-10-17 15:31:29
【问题描述】:

我目前正在尝试在 Linux 上的 Golang 中执行一个简单的 echo 命令。我的代码如下:

cmd = exec.Command("echo", "\"foo 0x50\"", ">", "test.txt")

_, err = cmd.Output()

if err != nil {
    fmt.Println(err)
}

但是 test.txt 没有出现在我的文件夹中(即使在编译和运行代码之后)。这不是我第一次使用这种方法执行命令,而且我从没想过我会被 echo 命令阻塞。

那么如何修复此代码以便在 test.txt 中包含“foo 0x50”(带引号)?

【问题讨论】:

    标签: go echo


    【解决方案1】:

    您可以像这样重定向标准输出:

    // Remove the redirect from command
    cmd := exec.Command("echo", "\"foo 0x50\"")
    
    // Make test file
    testFile, err := os.Create("test.txt")
    if err != nil {
        panic(err)
    }
    defer outfile.Close()
    
    // Redirect the output here (this is the key part)
    cmd.Stdout = testFile
    
    err = cmd.Start(); if err != nil {
        panic(err)
    }
    cmd.Wait()
    

    【讨论】:

    • 好的!但是为什么我不能像一开始那样在一行上做呢?
    • @Majonsi,是的——你只需要知道那些 ><| 等是由你的 shell 解释的,exec.Cmd.Run 将进程规范铲入其中的操作系统内核对它们一无所知。所以“在一行中”的一种方法是执行/bin/sh -c "echo blah blah >file.txt",这样就不会产生/bin/echo,而是一个shell,然后告诉它执行一个特定的脚本。 shell 从脚本中解析出重定向并安排它们发生。
    • @Majonsi,请注意,虽然这可行,但在走这条路之前,您必须考虑 三次 (或更多):一旦您需要编码一些数据可能包含单引号或双引号或重定向符号或诸如此类的内容,您将进入引用地狱。更糟糕的是,当您需要将一些从用户获取的数据传递给命令时:您将必须正确保护它不被 shell 解释,这意味着在那句名言深入人心。最好不要,真的。
    • @Majonsi,在您的特定情况下,Tyler 的代码可能已包装到单个函数中。如果你想让这些东西更灵活,最好使用一个经过实战测试的特殊库:labix.org/pipe
    • 好的!感谢您的出色解释和解决方案。您可以发布您的答案以便接受它作为解决方案吗?
    【解决方案2】:

    对于任何想要在 oneline/string 中传递完整命令的人,

    func call(command string) {
        cmd := exec.Command("sudo", "bash", "-c", command)
        cmd.Stdin = os.Stdin
        cmd.Stdout = os.Stdout
        cmd.Stderr = os.Stderr
        err := cmd.Start()
        if err != nil {
          fmt.Println(err)
        }
        err1 := cmd.Wait()
        if err1 != nil {
          fmt.Println(err1)
        }
     }
    

    Wait 等待命令退出并等待任何复制到 stdin 或从 stdout 或 stderr 复制完成。它在看到命令退出后关闭管道。

    来源:

    https://stackoverflow.com/a/43246464/9892358

    https://stackoverflow.com/a/43246464/9892358

    https://zetcode.com/golang/exec-command/

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2021-07-15
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2011-03-18
      • 2016-09-27
      • 2012-09-24
      相关资源
      最近更新 更多