Reputation: 17335
I compile a program with Go for various platforms and run it by calling a relative path or just by its name (if it is in the PATH variable).
Is it possible to find out where the executable is?
Say, my program is called "foo
(.exe
)". I can run ./foo
, foo
(if it's in the PATH), ../../subdir/subdir/foo
.
I have tried to use os.Args[0]
and I guess I should check if the program name contains something different besides "foo". If yes, use filepath.Abs
, if no, use (I can't find the function name, there is a function that looks through the PATH to check where the program is).
Upvotes: 39
Views: 27216
Reputation: 1341
You can use os.Executable
for getting executable path on Go 1.8 or above version.
import (
"os"
"path"
"log"
)
func main() {
ex, err := os.Executable()
if err != nil { log.Fatal(err) }
dir := path.Dir(ex)
log.Print(dir)
}
Upvotes: 50
Reputation: 1422
Use package osext.
It's providing function Executable()
that returns an absolute path to the current program executable.
It's portable between systems.
package main
import (
"github.com/kardianos/osext"
"fmt"
)
func main() {
filename, _ := osext.Executable()
fmt.Println(filename)
}
Upvotes: 46
Reputation: 37208
This is not go-specific (unless the go "standard library" contains some function to do it), and there is no portable solution. For solutions on some common platforms, see e.g. How do I find the location of the executable in C? or Finding current executable's path without /proc/self/exe .
Upvotes: 4