繁体   English   中英

exec.Command() 中的复杂命令

[英]Complex command in exec.Command()

我想执行这个命令:

docker exec -it demoContainer bash -c "pip freeze" > "requirements.txt"

但是找不到任何带有管道的复杂命令的示例,并且 output 写道。

我试过这个:

cmd := exec.Command("docker", "exec -it demoContainer bash -c \"pip freeze\" > \"requirements.txt\"")
_, err = cmd.CombinedOutput()

和:

cmd := exec.Command("docker", "exec", "-it", "demoContainer", "bash", "-c", "pip freeze", ">", "scheduleDeploy/requirements.txt")
_, err = cmd.CombinedOutput()

但总是因以下 output 而崩溃:

Error: Exit status 1

编辑

带有答案想法的更新:

err = exec.Command("sh", "-c","'docker exec -it demoContainer bash -c 'pip freeze' > 'requirements.txt''").Run()

Output:

Exit error status 2 

>重定向是“shell”的东西,而不是“exec”的东西。 您将需要执行“使用要执行的命令运行 bash”或“打开文件,将生成的 os.File 设置为 exec.Command 的标准输出,然后再启动它”之一。

要么可能会解决您面临的问题。

要使用“bash -c”版本,例如:

    exec.Command("bash", "-c", `docker exec -it demoContainer bash -c "pip freeze" > requirements.txt`)

您不必使用 shell 进行重定向,您可以让 Go 执行此操作:

package main

import (
   "os"
   "os/exec"
)

func main() {
   f, e := os.Create("requirements.txt")
   if e != nil {
      panic(e)
   }
   defer f.Close()
   c := exec.Command(
      "docker", "exec", "-it", "demoContainer", "bash", "-c", "pip freeze",
   )
   c.Stdout = f
   c.Run()
}

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM