Golang中的Echo命令

Maj*_*nsi 3 echo go

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

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

_, err = cmd.Output()

if err != nil {
    fmt.Println(err)
}
Run Code Online (Sandbox Code Playgroud)

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

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

Tyl*_*ler 5

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

// 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()
Run Code Online (Sandbox Code Playgroud)

  • @Majonsi,是的-您只需要知道那些`>`,`<`,`|`等是由您的* shell *解释的,并且是exec.Cmd.Run`嵌入其中的OS内核。过程规范对此一无所知。因此,“一行”执行的一种方法是执行`/ bin / sh -c“ echo blah blah> file.txt”`,这样就不会生成`/ bin / echo`而是告诉一个shell。执行特定的脚本。Shell从脚本中解析出该重定向,并安排它们发生。 (2认同)
  • @Majonsi,请注意,尽管这行得通,但在踏上这条路线之前,您必须先想一想*三次*(或更多):一旦您需要编码一些可能包含单引号或双引号或重定向符号或您输入的内容的数据引用地狱。更糟糕的是,当您需要传递给命令来执行从用户那里获取的一些数据时:您将*必须*适当地保护它,以免被shell解释,这意味着您会在报价单中徘徊-深入其中。最好不要,真的。 (2认同)