다음 Errno::ENOENT: No such file or directory
은 파일이 존재하더라도 실패 합니다.
open('~/some_file')
그러나 다음과 같이 할 수 있습니다.
open(File.expand_path('~/some_file'))
두 가지 질문이 있습니다.
open
물결표가 홈 디렉토리를 가리키는 것으로 처리 하지 않는 이유는 무엇 입니까?- 보다 매끄러운 방법이
File.expand_path
있습니까?
답변
- 셸 (bash, zsh 등)은 와일드 카드 확장을 담당하므로 첫 번째 예에서는 셸이 없으므로 확장이 없습니다. 물결표를 사용하여 가리키는
$HOME
것은 단순한 관습입니다. 실제로에 대한 문서를 보면File.expand_path
물결표를 올바르게 해석하지만 기본 시스템에 내재 된 것이 아니라 함수 자체의 기능입니다. 또한,File.expand_path
필요$HOME
올바르게 설정해야 할 환경 변수를. 가능한 대안으로 우리를 데려옵니다 … -
이 시도:
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이 제공되지 않는 한 프로세스의 현재 작업 디렉토리에서 참조되며,이 경우 시작점으로 사용됩니다. 주어진 경로 이름이 “~”로 시작하면 확장되지 않고 일반 디렉토리 이름으로 처리됩니다.