以下は、実行中のユーザーのホームディレクトリを取得する最良の方法ですか?それとも、私が見てきた特定の機能はありますか?
os.Getenv("HOME")
上記が正しい場合、誰かがたまたまこのアプローチがLinux以外のプラットフォーム(Windowsなど)で機能することが保証されているかどうかを知っていますか?
回答:
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
go1.12 +では、os.UserHomeDir()を使用できます
home, err := os.UserHomeDir()
https://golang.org/pkg/os/#UserHomeDirを参照してください
これは、CGOが有効になっていない場合(つまりFROM scratch
)でも、解析/etc/passwd
や他のそのようなナンセンスを実行しなくても機能するはずです。
例えば、
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)
}
USERPROFILE
システム上のユーザーのストレージスペースのルートですが、アプリケーションが保存ダイアログプロンプトの外側に書き込む必要がある場所ではありません。アプリケーション設定がある場合はAPPDATA
書き込みを行い、アプリケーションキャッシュ(またはネットワーク経由で同期してはならない大きなファイル)がある場合はLOCALAPPDATA
Windowsに書き込む必要があります。
これを行うには、簡潔で簡潔な方法があります(UNIXベースのシステムでのみ実行している場合)。
import (
"os"
)
var home string = os.Getenv("HOME")
これは、$ HOME環境変数を照会するだけです。
---編集---
これと同じ方法が上記で提案されていることがわかりました。この例は、ここでは蒸留溶液のままにしておきます。
@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())
}
APPDATA
構成用およびLOCALAPPDATA
大きなファイル用。一般的な目的の「ホーム」にはLOCALAPPDATA
、デフォルトでアプリケーション開発者が企業ネットワークを破壊しないようにすることをお勧めします。😊
環境変数を使用するUSERPROFILE
かHOMEPATH
、Windowsで使用する必要があります。認識される環境変数を参照してください(より適切なドキュメントリンクを歓迎します)。
HOME
、おそらくcygwinで実行していることを意味するので、を使用します。
USERPROFILE
か、HOMEPATH
大多数の場合、Windows上で。開発者がそれらを使用するほとんどすべての場合、使用する必要があるのはAPPDATA
またはですLOCALAPPDATA
(ログイン/ログアウト時にコンテンツがネットワーク経由で同期することが妥当かどうかによって異なります)。
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)
}
APPDATA
か、LOCALAPPDATA
ほとんど常に正しい選択ではないUSERPROFILE
Windows上で、。
$HOME
必ずしもユーザーのホームディレクトリではありません。たとえばexport HOME=/something/else
、プログラムを起動する前に書くことができます。通常、これは、何らかの理由でプログラムをホームディレクトリとして扱いたいことを意味/something/else
します。通常、プログラムはそれを受け入れます。しかし、ユーザーの実際のホームディレクトリが本当に必要な場合は、環境変数が必ずしもそれを与えるとは限りません。