Найти путь к исполняемому файлу

Я компилирую программу с Go для различных платформ и запускаю ее, вызывая относительный путь или просто по его имени (если он находится в переменной PATH).

Можно ли узнать, где находится исполняемый файл?

Скажем, моя программа называется "foo (.exe)". Я могу запустить ./foo, foo (если он находится в PATH), ../../subdir/subdir/foo.

Я попытался использовать os.Args[0], и я предполагаю, что я должен проверить, содержит ли название программы что-то другое, кроме "foo". Если да, используйте filepath.Abs, если нет, используйте (я не могу найти имя функции, есть функция, которая просматривает PATH, чтобы проверить, где находится программа).

Ответ 1

Использовать пакет osext.

Он предоставляет функцию Executable(), которая возвращает абсолютный путь к текущему исполняемому файлу программы. Он переносится между системами.

Онлайн-документация

package main

import (
    "github.com/kardianos/osext"
    "fmt"
)

func main() {
    filename, _ := osext.Executable()
    fmt.Println(filename)
}

Ответ 2

Вы можете использовать os.Executable для получения исполняемого пути в версии 1.8 или выше.

import (
    "os"
    "path"
    "log"
)

func main() {
    ex, err := os.Executable()
    if err != nil { log.Fatal(err) }
    dir := path.Dir(ex)
    log.Print(dir)
}

Ответ 3

Это не зависит от типа (если только "стандартная библиотека" go не содержит какой-либо функции), и нет портативного решения. Для решений на некоторых общих платформах см., Например, Как найти местоположение исполняемого файла в C? или Поиск текущего пути исполняемого файла без/proc/self/exe.