web-dev-qa-db-ja.com

ユーザーのホームディレクトリを取得する

実行中のユーザーのホームディレクトリを取得する最良の方法は次のとおりですか?または、私が見た特定の機能はありますか?

os.Getenv("HOME")

上記が正しい場合、このアプローチが非Linuxプラットフォームで動作することが保証されているかどうかを誰かが知っていますか? Windows?

78
Paul Ruane

Go 1.0.3(おそらく以前のバージョンでも)では、次のように動作します:

package main
import (
    "os/user"
    "fmt"
    "log"
)
func main() {
    usr, err := user.Current()
    if err != nil {
        log.Fatal( err )
    }
    fmt.Println( usr.HomeDir )
}

クロスコンパイルが重要な場合は、 homedirライブラリ

156
Vlad Didenko

例えば、

package main

import (
    "fmt"
    "os"
    "runtime"
)

func UserHomeDir() string {
    if runtime.GOOS == "windows" {
        home := os.Getenv("HOMEDRIVE") + os.Getenv("HOMEPATH")
        if home == "" {
            home = os.Getenv("USERPROFILE")
        }
        return home
    }
    return os.Getenv("HOME")
}

func main() {
    dir := UserHomeDir()
    fmt.Println(dir)
}
19
peterSO

os.UserHomeDir()

Go1.12 +では、os.UserHomeDir()を使用できます

home, err := os.UserHomeDir()

https://golang.org/pkg/os/#UserHomeDir を参照してください

これは、CGOが有効になっていなくても(つまり、FROM scratch)、/etc/passwdなどのナンセンスを解析しなくても機能するはずです。

16
CoolAJ86

これを行うための素敵で簡潔な方法を次に示します(UNIXベースのシステムでのみ実行している場合)。

import (
  "os"
)

var home string = os.Getenv("HOME")

これは、$ HOME環境変数を照会するだけです。

---編集---

この同じ方法が上で提案されたことがわかりました。この例を蒸留溶液として残します。

4
Murphy Randle

@peterSOへの同様の答えですが、XDG_CONFIG_HOME Linuxのパス。

package main

import (
    "fmt"
    "os"
    "runtime"
)

func userHomeDir() string {
    if runtime.GOOS == "windows" {
        home := os.Getenv("HOMEDRIVE") + os.Getenv("HOMEPATH")
        if home == "" {
            home = os.Getenv("USERPROFILE")
        }
        return home
    } else if runtime.GOOS == "linux" {
        home := os.Getenv("XDG_CONFIG_HOME")
        if home != "" {
            return home
        }
    }
    return os.Getenv("HOME")
}

func main() {
    fmt.Println(userHomeDir())
}
2
Miguel Mota

go1.8rc2には、ホームディレクトリを取得するgo/build/defaultGOPATH関数があります。 https://github.com/golang/go/blob/go1.8rc2/src/go/build/build.go#L260-L277

次のコードは、defaultGOPATH関数から抽出されます。

package main

import (
    "fmt"
    "os"
    "runtime"
)

func UserHomeDir() string {
    env := "HOME"
    if runtime.GOOS == "windows" {
        env = "USERPROFILE"
    } else if runtime.GOOS == "plan9" {
        env = "home"
    }
    return os.Getenv(env)
}

func main() {
    dir := UserHomeDir()
    fmt.Println(dir)
}
2
hnakamur

Windowsでは、環境変数USERPROFILEまたはHOMEPATHを使用する必要があります。 認識された環境変数 を参照してください(より適切なドキュメントリンクを歓迎します)。

2