Come aprire i file relativi alla directory home


95

Quanto segue non riesce con Errno::ENOENT: No such file or directory, anche se il file esiste:

open('~/some_file')

Tuttavia, posso farlo:

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

Ho due domande:

  1. Perché non openelabora la tilde come se punta alla directory home?
  2. C'è un modo più semplice di File.expand_path?

Risposte:


109
  1. La shell (bash, zsh, ecc.) È responsabile dell'espansione dei caratteri jolly, quindi nel tuo primo esempio non c'è shell, quindi nessuna espansione. Usare la tilde per indicare $HOMEè una semplice convenzione; infatti, se guardi la documentazione File.expand_path, interpreta correttamente la tilde, ma è una caratteristica della funzione stessa, non qualcosa di inerente al sistema sottostante; inoltre, File.expand_pathrichiede che la $HOMEvariabile d'ambiente sia impostata correttamente. Il che ci porta alla possibile alternativa ...
  2. Prova questo:

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

Spero sia abbastanza liscio. Personalmente penso che usare una variabile d'ambiente sia semanticamente più chiaro che usare expand_path.


utilizzando Windows .. doveva fareopen(ENV['HOME']+'some_file')
David West

9
Usalo semplicemente File.join(ENV['HOME'], '/some_file')per farlo funzionare in entrambi i casi.
Marcin Bilski


12

Invece di fare affidamento sul fatto che la $HOMEvariabile di ambiente sia impostata correttamente, il che potrebbe essere una seccatura quando si utilizzano computer di rete condivisi per lo sviluppo, è possibile ottenerlo da Ruby utilizzando:

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

Credo che questo identifichi l'utente attualmente connesso e ottenga la sua home directory piuttosto che fare affidamento sulla $HOMEvariabile di ambiente globale impostata. Questa è una soluzione alternativa a quanto sopra credo.


2

Ho scoperto il problema della tilde e per aggiungere è stata creata una patch absolute_path che tratta la tilde come un personaggio normale.

Dalla documentazione del file:

absolute_path(file_name [, dir_string] )  abs_file_name

Converte un percorso in un percorso assoluto. I percorsi relativi sono referenziati dalla directory di lavoro corrente del processo a meno che non venga fornito dir_string, nel qual caso verrà utilizzato come punto di partenza. Se il percorso specificato inizia con un "~" NON viene espanso, viene trattato come un normale nome di directory.

Utilizzando il nostro sito, riconosci di aver letto e compreso le nostre Informativa sui cookie e Informativa sulla privacy.
Licensed under cc by-sa 3.0 with attribution required.