如何在Go中重定向命令而不将结果输出到终端?

时间:2014-04-28 04:12:59

标签: go exec

我想在Go程序中运行命令:pbcopy < file.csv。但是,看起来Go的os/exec包不能使用<语法将一个命令重定向到另一个命令。所以我决定在我的程序中使用管道。但是,这个脚本:

package main

import (
    "os/exec"
)

func main() {
    cmd1 := exec.Command("cat", "test.csv")
    cmd2 := exec.Command("pbcopy")
    out, _ := cmd1.StdoutPipe()
    cmd2.Stdin = out
    cmd2.Run()
}

当我运行上述程序时,程序不会终止,它看起来像等待终端用户的输入。当我终止它并尝试将结果粘贴到任何不接受输入的地方并将其保存到剪贴板。

然后我将程序的最后一行从cmd2.Run()更改为cmd2.Start(),然后程序正确终止。但是,剪贴板中填充了空字符串,而不是将cat file.csv输出保存到剪贴板。

我试图在Go中的os.exec中查找一些使用管道的示例,但我看到的所有内容都假设结果最终输出到终端,例如ls -l | wc -l或{ {1}}或类似的事情。但ls -l | grep "py"命令不显示输入,只是将输入保存到剪贴板。

那么如何使用pbcopy命令在Go中的os.exec包中使用重定向(或管道)?

1 个答案:

答案 0 :(得分:4)

您需要启动命令1.命令2正在等待来自命令1的输入,并且可能无限期地等待。

cmd1.Start()
cmd2.Run()

编辑:回顾这个问题,你为什么要把这个作为两个命令呢?相反,您可以os.Open("test.csv")并将文件指针直接传递给cmd2.Stdin