web-dev-qa-db-fra.com

Moyens multiplateformes pour obtenir le répertoire personnel de l'utilisateur dans Ruby?

Java a la System.getProperty("user.home") pratique pour obtenir le répertoire "home" de l'utilisateur d'une manière indépendante de la plateforme. Quel est l'équivalent en Ruby? Je n'ai pas de boîte Windows avec laquelle jouer, et j'ai l'impression que compter sur des tildes dans les noms de fichiers n'est pas le moyen le plus propre. Existe-t-il des alternatives?

57
davetron5000

La méthode File.expand_path utilise la convention Unix de traitement spécial du tilde (~), De sorte que ~ Fait référence au répertoire personnel de l'utilisateur actuel et ~foo Fait référence au répertoire personnel de foo.

Je ne sais pas s'il existe une méthode meilleure ou plus idiomatique, mais File.expand_path('~') devrait vous aider.

82
Jörg W Mittag

Avec Ruby 1.9 et plus, vous pouvez utiliser Dir.home .

98
Pioz

Sur les plates-formes Unix (linux, OS X, etc.), ENV["HOME"], File.expandpath('~') ou Dir.home Dépendent tous de la variable d'environnement HOME définie. Mais parfois, vous constaterez que la variable d'environnement n'est pas définie - cela est courant si vous exécutez à partir d'un script de démarrage ou de certains planificateurs de lots. Si vous êtes dans cette situation, vous pouvez toujours obtenir votre répertoire personnel correct via les éléments suivants:

require 'etc'
Etc.getpwuid.dir

Cela dit, comme cette question demande une méthode "multiplateforme", il faut noter que cela ne fonctionnera pas sous Windows (Etc.getpwuid Y renverra nil.) Sous Windows, ENV["HOME"] Et les méthodes mentionnées ci-dessus qui en dépendent fonctionneront, bien que la variable HOME ne soit pas couramment définie sur Windows - au démarrage, Ruby remplira dans ENV["HOME"] en fonction des variables d'environnement windows HOMEPATH et HOMEDRIVE. Si les variables d'environnement windows HOMEDRIVE et HOMEPATH ne sont pas définies, cela ne fonctionnera pas. Je ne sais pas à quel point cela est courant dans les environnements Windows, et je ne connais aucune alternative qui fonctionne sur Windows.

10
Micah

ENV["HOME"] ou ENV["HOMEPATH"] devrait vous donner ce que vous voulez.

homes = ["HOME", "HOMEPATH"]

realHome = homes.detect {|h| ENV[h] != nil}

if not realHome
   puts "Could not find home directory"
end
10
Jacob Relkin

Cela fonctionne sur tous les systèmes d'exploitation

  • Pour l'utilisateur actuel
Dir.home
  • Pour un utilisateur donné
Dir.home('username')

Remarque: Le nom d'utilisateur est sensible à la casse sous Linux mais pas sous Windows ou macOS

5
KING SABRI