2011-10-27 22 views
59

¿Es la siguiente la mejor manera de obtener el directorio de inicio del usuario en ejecución? ¿O hay una función específica que he desarrollado?Obtener el directorio de inicio del usuario

os.Getenv("HOME") 

Si lo anterior es correcto, ¿alguien le suceda a saber si está garantizada este enfoque para trabajar en plataformas que no son Linux, por ejemplo, Windows?

+2

'$ HOME' no es * necesariamente * el directorio de inicio del usuario. Por ejemplo, puedo escribir 'export HOME =/something/else' antes de iniciar su programa. Usualmente eso significa que * quiero * que el programa trate '/ something/else' como mi directorio de inicio por alguna razón, y generalmente el programa debería aceptar eso. Pero si realmente necesita el directorio de inicio * real * del usuario, una variable de entorno no necesariamente se lo proporcionará. –

+1

@KeithThompson Gracias pero para mis propósitos es lo suficientemente bueno. –

Respuesta

120

En ir a 1.0.3 (probablemente antes, también) las siguientes obras:

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

Si es importante compilación cruzada, considere the homedir library

+1

Impresionante, muchas gracias. No estaba consciente de este cambio. Esto es exactamente lo que estaba buscando. –

+0

¿Soy solo yo o soy el único en el que hacer esto en Windows lleva varios segundos? – Htbaa

+0

Definitivamente parece instantáneo en mi Windows 7 64bit VM. –

2

Debe usar la variable de entorno USERPROFILE o HOMEPATH en Windows. Ver Recognized Environment Variables (un enlace de documentación más apropiado sería bienvenido).

+0

Gracias. ¿Estás diciendo, entonces, que HOME no está ocupado por Go para cada plataforma (que delega directamente en los archivos de O/S) y debo verificar la variable respectiva de cada plataforma para identificar el directorio de inicio? –

+0

He echado un vistazo a la fuente y parece que HOME no se completa automáticamente. Parece que (actualmente) no hay una instalación agnóstica de plataforma para obtener el directorio inicial. –

+0

@PaulRuane Dado que las plataformas usan diferentes variables, simplemente ignore el sistema operativo, verifique ambas variables y vaya con el que esté ocupado. Si ambos están definidos, usaría 'HOME', ya que eso probablemente significa que se está ejecutando bajo cygwin. –

10

Por ejemplo,

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) 
} 
+0

Este es el mismo enfoque que Jeremy W Sherman, que parece ser la única manera en el presente. Muchas gracias. –

+0

Este es el enfoque seguido en viper util.go [userHomeDir()] (https://github.com/spf13/viper/blob/80ab6657f9ec7e5761f6603320d3d58dfe6970f6/util.go#L144-L153) – ecerulm

2

Aquí hay una forma agradable y concisa de hacerlo (si solo está ejecutando en un sistema basado en UNIX):

import (
    "os" 
) 

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

Eso solo cuestiona la variable de entorno $ HOME.

--- --- Editar

ahora veo que este mismo método se sugirió anteriormente. Dejaré este ejemplo aquí como una solución destilada.

+1

1. se ha sugerido antes, 2. no es multiplataforma, 3. la respuesta aceptada ya resuelve este problema de una mejor manera. –

1

go1.8rc2 tiene la función go/build/defaultGOPATH que obtiene el directorio de inicio. https://github.com/golang/go/blob/go1.8rc2/src/go/build/build.go#L260-L277

El siguiente código se extrae de la función 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) 
} 
+0

Aunque la implementación de esta función Go es interesante, esta es una solución peor que usar la función de biblioteca estándar descrita en la respuesta aceptada. (Y es el mismo enfoque que la respuesta de peterSO de hace seis años.) –

Cuestiones relacionadas