tildes que palabras ortograficos ortografico graves esdrujulas con agudas acentos acento path go

path - palabras - que es el acento



Expandir tilde al directorio de inicio (5)

En general, el shell se expande ~ antes de que llegue a su programa. Pero hay algunas limitaciones .

En general no es aconsejable hacerlo manualmente en Go .

Tuve el mismo problema en un programa mío y lo que he entendido es que si uso el formato de --flag=~/myfile como --flag=~/myfile , no está expandido. Pero si ejecuta --flag ~/myfile el shell lo expande (falta el = = y el nombre del archivo aparece como una "palabra" separada).

Tengo un programa que acepta una carpeta de destino donde se crearán los archivos. Mi programa debería ser capaz de manejar rutas absolutas así como rutas relativas. Mi problema es que no sé cómo expandir ~ al directorio de inicio.

Mi función para expandir el destino se ve así. Si la ruta dada es absoluta, no hace nada, de lo contrario, une la ruta relativa con el directorio de trabajo actual.

import "path" import "os" // var destination *String is the user input func expandPath() { if path.IsAbs(*destination) { return } cwd, err := os.Getwd() checkError(err) *destination = path.Join(cwd, *destination) }

Dado que path.Join no se expande ~ no funciona si el usuario pasa algo como ~/Downloads como destino.

¿Cómo debo resolver esto de una manera multiplataforma?


Go proporciona el paquete os/user , que le permite obtener el usuario actual y, para cualquier usuario, su directorio de inicio:

usr, _ := user.Current() dir := usr.HomeDir

Luego, use path/filepath para combinar ambas cadenas en una ruta válida:

if path == "~" { // In case of "~", which won''t be caught by the "else if" path = dir } else if strings.HasPrefix(path, "~/") { // Use strings.HasPrefix so we don''t match paths like // "/something/~/something/" path = filepath.Join(dir, path[2:]) }

(Tenga en cuenta que user.Current () no se implementa en el campo de juegos de Go (probablemente por razones de seguridad), por lo que no puedo dar un ejemplo fácilmente ejecutable).


Normalmente, ~ se expande por el shell antes de que su programa lo vea.
Ajuste cómo su programa adquiere sus argumentos desde la línea de comandos de una manera compatible con el mecanismo de expansión del shell.

Uno de los posibles problemas es usar exec.Command como este:

cmd := exec.Command("some-binary", someArg) // say ''someArg'' is "~/foo"

Que no se ampliará. Puede, por ejemplo, utilizar en su lugar:

cmd := exec.Command("sh", "-c", fmt.Sprintf("''some-binary %q''", someArg))

que obtendrá la expansión estándar ~ desde el shell.

EDITAR: arreglado el ejemplo ''sh -c''.


Sé que esta es una vieja pregunta pero ahora hay otra opción. Puede usar go-homedir para expandir el tidle al homedir del usuario:

myPath := "~/.ssh" fmt.Printf("path: %s; with expansion: %s", myPath, homedir.Expand(myPath))


Si está expandiendo tilde ''~'' para usar con exec.Command() , debe usar el shell local de los usuarios para la expansión.

// ''sh'', ''bash'' and ''zsh'' all respect the ''-c'' argument cmd := exec.Command(os.Getenv("SHELL"), "-c", "cat ~/.myrc") cmd.Stdout = os.Stdout if err := cmd.Run(); err != nil { fmt.Fprintln(os.Stderr, err) }

Sin embargo; al cargar archivos de configuración de la aplicación, como ~./myrc esta solución no es aceptable. Lo siguiente me ha funcionado bien en múltiples plataformas.

import "os/user" import "path/filepath" func expand(path string) (string, error) { if len(path) == 0 || path[0] != ''~'' { return path, nil } usr, err := user.Current() if err != nil { return "", err } return filepath.Join(usr.HomeDir, path[1:]), nil }

NOTA: usr.HomeDir no respeta $HOME lugar determina el directorio de inicio al leer el /etc/passwd través del getpwuid_r getpwuid_r en (osx / linux). En Windows utiliza el OpenCurrentProcessToken OpenCurrentProcessToken para determinar el directorio de inicio de los usuarios.