Cómo abrir archivos relacionados con el directorio de inicio

95

Lo siguiente falla Errno::ENOENT: No such file or directory, incluso si el archivo existe:

open('~/some_file')

Sin embargo, puedo hacer esto:

open(File.expand_path('~/some_file'))

Tengo dos preguntas:

  1. ¿Por qué no openprocesa la tilde como apuntando al directorio de inicio?
  2. ¿Hay alguna manera más hábil que File.expand_path?
Pedro
fuente

Respuestas:

109
  1. El shell (bash, zsh, etc.) es responsable de la expansión de comodines, por lo que en su primer ejemplo no hay shell, por lo tanto, no hay expansión. Usar la tilde para señalar $HOMEes una mera convención; de hecho, si busca en la documentación File.expand_path, interpreta correctamente la tilde, pero es una característica de la función en sí, no algo inherente al sistema subyacente; Además, File.expand_pathrequiere que la $HOMEvariable de entorno esté configurada correctamente. Lo que nos lleva a la posible alternativa ...
  2. Prueba esto:

    open(ENV['HOME']+'/some_file')

Espero que sea lo suficientemente hábil. Personalmente, creo que usar una variable de entorno es semánticamente más claro que usar expand_path.

Roadmaster
fuente
uso de Windows ... tenía que haceropen(ENV['HOME']+'some_file')
David West
9
Úselo simplemente File.join(ENV['HOME'], '/some_file')para que funcione en ambos casos.
Marcin Bilski
123

No estoy seguro de si esto estaba disponible antes de Ruby 1.9.3, pero creo que la solución más elegante es usar la Dir.homeque es parte del núcleo.

open("#{Dir.home}/some_file")
allesklar
fuente
2
No, no disponible para usuarios por debajo de 1.9.3 ( apidock.com/ruby/v1_9_2_180/Dir/home/class ).
Ian Vaughan
12

En lugar de confiar en que la $HOMEvariable de entorno esté configurada correctamente, lo que podría ser una molestia cuando usa computadoras de red compartidas para el desarrollo, puede obtener esto de Ruby usando:

require 'etc'
open ("#{Etc.getpwuid.dir}/some_file")

Creo que esto identifica al usuario que ha iniciado sesión actual y obtiene su directorio de inicio en lugar de depender de la $HOMEvariable de entorno global que se establece. Esta es una solución alternativa a la anterior, creo.

Voke Ransom Anighoro
fuente
2

Descubrí el problema de la tilde y se creó un parche para agregar absolute_path que trata la tilde como un carácter ordinario.

De la documentación del archivo:

absolute_path(file_name [, dir_string] )  abs_file_name

Convierte un nombre de ruta en un nombre de ruta absoluto. Las rutas relativas se referencian desde el directorio de trabajo actual del proceso a menos que se proporcione dir_string, en cuyo caso se utilizará como punto de partida. Si la ruta indicada comienza con un “~”, NO está expandido, se trata como un nombre de directorio normal.

Charles Edward Thornton
fuente