루비로 개발을 하면서 Java와 다르게 재미난(?) 환경 변수가 있다는걸 알게되었는데, 그게 __FILE__ 과 $0 이다.
__FILE__은 현재 실행 되고 있는 ruby file path, $0는 main으로 실행된 ruby file path, 즉 첫번째로 실행된 ruby file을 알려준다. 어떻게 보면 별거 아닌 것일 수도 있는데, 여러 작업에서 유용하게 쓰인다.
1. main script 작성에 활용
—
…
# 현재 파일이 main으로 실행되었는지 확인하는 구문
if __FILE__ == $0 then
# main code 작성
end
—
Ruby가 script언어이다 보니 Java나 C같은 언어와 다르게 프로그램의 시작을 알려주는 main이란 구역이 없다. 이런 단점은 main역할을 하는 code를 담고 있는 script가 다른 module에서 로드될때 많은 골칫거리를 만들어 내게 하는데, 이부분은 __FILE__과 $0로 쉽게 해결 가능하다.
위 코드의 if문 안의 코드들은 현재의 파일이 main으로 실행되었을 때만 작동하므로 Java나 C의 main과 다를 것이 없다.
2. require 경로를 상대적으로 기술
—
home = File.join(File.dirname(__FILE__), ‘/..’)
require File.join(home, ‘lib/usage_collector’)
—
그냥 require(path)를 하게되면 실행 path의 영향을 받기 때문에 상황에 따라 require가 파일을 제대로 찾지 못할 경우가 많다. 대표적으로 gem으로 잘 돌아가던게 소스로 받아서 돌리면 안되거나 source로 실행할때는 잘되던게 gem으로 만들면 안돌아간다.
초기 작성시 위의 소스 코드처럼 __FILE__을 사용하여 home을 확실하게 지정해주면 require 엄한 위치를 헤메는 일이 없어진다. 이렇게 작성해 놓으면 gem으로 실행하든 source 상태로 실행하든 상관없이 잘 돌아간다.
3. 그외 이런저런 파일 작업을 다룰때에도…
그외에도 파일을 다루다보면 기준 경로를 어디로 잡을 것인지가 매우 골치아픈 문제이다. __FILE__과 $0 이런 문제들을 쉽게 해결할 수 있는 단서를 제공해준다.
끝