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?

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.


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


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.


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.

Al usar nuestro sitio, usted reconoce que ha leído y comprende nuestra Política de Cookies y Política de Privacidad.
Licensed under cc by-sa 3.0 with attribution required.