dou91808
dou91808
2018-11-04 19:57

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

I'm trying to build binary with code and run the command against the bin (the bin is CLI) Via code,

mytest.go file

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

now after the code run, I was able to see the bin under testdata folder And now I’m want to run a command like fzr —help

Like following

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

I got error

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

Now If I take the fzr bin and put it in go/src/bin I was able to run fzr —help from the terminal

The project structure is like following

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

mytest is in the same level with the testadata and the fzr bin is under test data

What could be the problem ?

I try also to provide the full path to the bin with os.Getwd() which doesnt help ...

  • 点赞
  • 写回答
  • 关注问题
  • 收藏
  • 复制链接分享
  • 邀请回答

2条回答

  • doucheng1063 doucheng1063 3年前

    Applications accessing the shell, do often not execute the shell initialization/configuration. For example the cron an clearly also go do not execute the shell initialization.

    To make your program work add the absolute path to the executable, or alternative the relative path from the location where your application is started from:

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

    (Assuming that the path displayed is your actual path).

    点赞 评论 复制链接分享
  • douzao2590 douzao2590 3年前

    Actually if we want to run a binary/cmd, either it's path has to be listed in $PATH var or we've to specify it's path(absolute or relative). In this case the path for fzr command is not listed in the $PATH var, because if so, it would run without any problem.

    So either we've to use the relative path

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

    cmd.Dir = “./integration/testdata"

    or absolute path

    absolutePath, _ := os.Getwd()
    cmd := exec.Command(absolutePath+“/integration/testdata/fzr”, “—help”)
    
    点赞 评论 复制链接分享

为你推荐