我有一个脚本,用于使用"os/exec"包进行部署。我使用的一个命令如下:
cpInit = exec.Command("cp", "initScripts/nginx", "/etc/init.d/nginx")
和另一个:
startNginx = exec.Command("/etc/init.d/nginx", "start")
最初,我用err := cpInit.Run()
运行第一个命令,但后来当我运行第二个命令时,我得到了错误:
exec: "/etc/init.d/nginx": stat /etc/init.d/nginx: no such file or directory
但当程序退出时,/etc/init.d/nginx
就在那里,所以我认为第一个命令可能没有完成(即使Run()
等待命令返回)。我把Run()
改成了Start()
和Wait()
,只是得到了相同的结果。有人能告诉我为什么第二个命令找不到那个文件吗?
运行exec.Command(...)
时,它会立即运行并检查文件是否存在,但必须将错误推迟到调用Run()
,因为Command()
调用不会返回错误。
关于Command
的定义,请参见此处:http://golang.org/src/pkg/os/exec/exec.go?s=3410:3455#L99
它调用此处定义的LookPath(...)
:http://golang.org/src/pkg/os/exec/lp_unix.go?s=902:944#L23
您需要在知道文件存在之后初始化Command
——在您的复制命令上调用Run()
之后。