当在 Go 中使用 exec.Command() 执行命令时,通过管道传输一个命令的输出向他人发出命令可能具有挑战性。
请考虑以下事项例如:
out, err := exec.Command("ps", "cax").Output() // Works and prints command output
但是,当尝试将 ps 的输出通过管道传输到 grep 时,该命令失败,退出状态为 1:
out, err := exec.Command("ps", "cax | grep myapp").Output() // Fails
要解决这个问题,更惯用的方法是对每个命令使用 exec.Command() 并直接连接其标准输入/输出流。操作方法如下:
package main import ( "fmt" "os/exec" ) func main() { grep := exec.Command("grep", "redis") ps := exec.Command("ps", "cax") // Connect ps's stdout to grep's stdin. pipe, _ := ps.StdoutPipe() defer pipe.Close() grep.Stdin = pipe // Start ps first. ps.Start() // Run and get the output of grep. res, _ := grep.Output() fmt.Println(string(res)) }
这允许您执行多个命令并根据需要通过管道传输它们的输入和输出,从而提供灵活的方式来处理命令链。
以上是如何在 Go 的 `exec.Command()` 中正确管道命令输出?的详细内容。更多信息请关注PHP中文网其他相关文章!