如何从os.execute从代码运行二进制文件

时间:2018-11-04 19:57:39

标签: go child-process

我正在尝试使用代码构建二进制文件并针对bin运行命令(bin是CLI) 通过代码

mytest.go文件

cmd := exec.Command("go", "build",  "-o", "./integration/testdata/fzr”,)
cmd.Dir = “./testdata"
err := cmd.Run()

现在代码运行后,我可以在bin文件夹下看到testdata 现在,我想运行类似fzr —help

的命令

喜欢关注

cmdOut := exec.Command(“fzr”, “—help”)
cmdOut.Dir = "./testdata/"
err := cmdOut.Run()

我出错了

lookPathErr: {
    Name: “fzr”,
    Err: {
        s: "executable file not found in $PATH",
    },
}

现在,如果我将fzr容器放入go / src / bin中,则可以从终端运行fzr —help

项目结构如下

myGithubProject/
  |---- integration
   |---- -testdata
    |---- -fzr
   |---- -mytest.go

mytesttestadata处于同一级别,而fzr箱处于测试数据中

可能是什么问题?

我也尝试用os.Getwd()提供到bin的完整路径,这无济于事...

2 个答案:

答案 0 :(得分:0)

访问外壳程序的应用程序通常不执行外壳程序初始化/配置。例如,cron显然也不要执行外壳初始化。

要使您的程序正常工作,请将绝对路径添加到可执行文件,或者从您的应用程序的启动位置开始,选择相对路径:

exec.Command(“./integration/testdata/fzr”, “—help”)

(假设显示的路径是您的实际路径)。

答案 1 :(得分:-1)

实际上,如果我们要运行二进制文件/ cmd,则必须在$PATH var中列出它的路径,或者必须指定它的路径(绝对或相对)。在这种情况下,fzr变量中未列出$PATH命令的路径,因为如果这样,它将毫无问题地运行。

所以我们要么要使用相对路径

// since you set the working dir as `./testdata`
cmd := exec.Command(“./fzr”, “—help”)

cmd.Dir =“ ./integration/testdata”

或绝对路径

absolutePath, _ := os.Getwd()
cmd := exec.Command(absolutePath+“/integration/testdata/fzr”, “—help”)