[ruby] 홈 디렉토리와 관련된 파일을 여는 방법

다음 Errno::ENOENT: No such file or directory은 파일이 존재하더라도 실패 합니다.

open('~/some_file')

그러나 다음과 같이 할 수 있습니다.

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

두 가지 질문이 있습니다.

  1. open물결표가 홈 디렉토리를 가리키는 것으로 처리 하지 않는 이유는 무엇 입니까?
  2. 보다 매끄러운 방법이 File.expand_path있습니까?



답변

  1. 셸 (bash, zsh 등)은 와일드 카드 확장을 담당하므로 첫 번째 예에서는 셸이 없으므로 확장이 없습니다. 물결표를 사용하여 가리키는 $HOME것은 단순한 관습입니다. 실제로에 대한 문서를 보면 File.expand_path물결표를 올바르게 해석하지만 기본 시스템에 내재 된 것이 아니라 함수 자체의 기능입니다. 또한, File.expand_path필요 $HOME올바르게 설정해야 할 환경 변수를. 가능한 대안으로 우리를 데려옵니다 …
  2. 이 시도:

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

나는 그것이 충분히 매끄 럽기를 바랍니다. 개인적으로 환경 변수를 사용하는 것이를 사용하는 것보다 의미 상 더 명확하다고 생각 expand_path합니다.


답변

이것이 Ruby 1.9.3 이전에 사용 가능했는지 확실하지 않지만 가장 우아한 해결책은 Dir.home코어의 일부 를 사용 하는 것입니다.

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


답변

$HOME개발을 위해 공유 네트워크 컴퓨터를 사용할 때 번거로울 수있는 올바르게 설정된 환경 변수 에 의존하는 대신 다음을 사용하여 Ruby에서 가져올 수 있습니다.

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

나는 이것이 현재 로그인 한 사용자를 식별하고 $HOME설정된 전역 환경 변수에 의존하지 않고 홈 디렉토리를 얻는다고 생각합니다. 이것은 내가 생각하는 위의 대안 솔루션입니다.


답변

나는 물결표 문제를 발견했고 물결표를 absolute_path
평범한 문자로 취급 하는 패치를 추가했습니다 .

파일 문서에서 :

absolute_path(file_name [, dir_string] )  abs_file_name

경로 이름을 절대 경로 이름으로 변환합니다. 상대 경로는 dir_string이 제공되지 않는 한 프로세스의 현재 작업 디렉토리에서 참조되며,이 경우 시작점으로 사용됩니다. 주어진 경로 이름이 “~”로 시작하면 확장되지 않고 일반 디렉토리 이름으로 처리됩니다.


답변