Comment ouvrir les fichiers relatifs au répertoire de base

Ce qui suit échoue avec Errno::ENOENT: No such file or directory , même si le fichier existe:

 open('~/some_file') 

Cependant, je peux le faire:

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

J’ai deux questions:

  1. Pourquoi n’ouvre-t-il pas le tilde comme pointant vers le répertoire personnel?
  2. Existe-t-il une voie plus lisse que File.expand_path ?

  1. Le shell (bash, zsh, etc.) est responsable de l’expansion des caractères génériques, donc dans votre premier exemple, il n’y a pas de shell, donc pas d’extension. Utiliser le tilde pour pointer sur $HOME est une simple convention. en effet, si vous regardez la documentation de File.expand_path , elle interprète correctement le tilde, mais c’est une fonctionnalité de la fonction elle-même, et non quelque chose d’inhérent au système sous-jacent; De plus, File.expand_path nécessite que la variable d’environnement $HOME soit correctement définie. Ce qui nous amène à la possible alternative …
  2. Essaye ça:

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

J’espère que c’est assez lisse. expand_path je pense que l’utilisation d’une variable d’environnement est plus claire que l’utilisation de expand_path .

Je ne sais pas si cela était disponible avant Ruby 1.9.3 mais je trouve que la solution la plus élégante consiste à utiliser Dir.home qui fait partie du kernel.

 open("#{Dir.home}/some_file") 

Au lieu de compter sur la variable d’environnement $HOME définie correctement, ce qui peut être compliqué lorsque vous utilisez des ordinateurs partagés en réseau pour le développement, vous pouvez l’obtenir de Ruby en utilisant:

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

Je crois que cela identifie l’utilisateur actuellement connecté et obtient son répertoire personnel plutôt que de s’appuyer sur la variable d’environnement $HOME globale définie. Ceci est une solution alternative à ce qui précède, je pense.

J’ai découvert le problème du tilde et un patch a été créé pour append absolute_path qui traite tilde comme un caractère ordinaire.

De la documentation du fichier:

 absolute_path(file_name [, dir_ssortingng] ) → abs_file_name 

Convertit un chemin d’access en chemin d’access absolu. Les chemins relatifs sont référencés à partir du répertoire de travail en cours du processus, sauf si dir_ssortingng est donné, auquel cas il sera utilisé comme sharepoint départ. Si le chemin indiqué commence par un «~», il n’est PAS étendu, il est traité comme un nom de répertoire normal.