在 Go 中使用 exec.Command() 通过管道执行命令
在 Go 中使用 exec.Command() 函数时,用户尝试执行涉及管道的命令时可能会遇到困难。虽然执行简单命令很简单,但在这些命令中使用管道可能会带来挑战。
问题:
在这种情况下,用户观察到以下命令成功执行并打印“ps”命令的输出:
out, err := exec.Command("ps", "cax").Output()
尝试在命令中使用管道,如下所示,结果错误:
out, err := exec.Command("ps", "cax | grep myapp").Output()
解决方案:
要解决此问题,可以考虑两种方法:
一个选项是将整个命令行传递给 bash 并让它为您执行管道。这种方法可以通过使用以下代码来实现:
out, err := exec.Command("bash", "-c", "ps cax | grep myapp").Output()
处理这种情况的更惯用的方法就是使用 exec.Command() 函数创建两个单独的命令,然后连接它们的输入和输出流。这可以通过如下方式完成:
package main import ( "fmt" "os/exec" ) func main() { grep := exec.Command("grep", "redis") ps := exec.Command("ps", "cax") // Get ps's stdout and attach it to grep's stdin. pipe, _ := ps.StdoutPipe() defer pipe.Close() grep.Stdin = pipe // Run ps first. ps.Start() // Run and get the output of grep. res, _ := grep.Output() fmt.Println(string(res)) }
在此示例中,首先执行“ps”命令,并将其输出通过管道传输到“grep”命令,该命令根据“redis”过滤输出“ 细绳。然后将结果打印到标准输出。
以上是如何使用 exec.Command() 在 Go 中执行管道命令?的详细内容。更多信息请关注PHP中文网其他相关文章!