명령행 인자
루비 명령행은 세 부분으로 나뉜다. 루비 인터프리터 옵션, 그리고 실행해야 할 프로그램 이름, 프로그램의 매개 변수 집합이다.
ruby <옵션> <--> <프로그램 파일> <매개 변수>*
루비 옵션은 명령행 중에서 하으픈으로 시작하지 않은 부분이 나오기 전까지 또는 특별한 플래그인 --(하이픈 두 개)가 나오기 전까지다.
명령행 옵션
-0 [octal]
숫자 0 플래그는 레코드 구분 문자를 명시한다 -00으로 문단 모드가 되며 두 개의 연속되는 기본 레코드 구분자로 구분된다
-a
-n이나 -p와 함께 사용하면 자동 분할을 가리킨다. 각 루프 반복 첫 부분에 $F=$_.split를 실행하는 것과 동일하다.
-C 디렉터리
실행하기 전에 작업 디렉터리를 이동한다.
-c
문법 검사만 실행한다. 프로그램은 실행하지 않는다.
--copytight
저작권을 보여주고 종료한다.
-d, --debug
$DEBUG와 $VERBOSE를 true로 설정한다. 이 옵션은 프로그램을 추가로 추적(디버깅)할 수 있도록 도와준다.
--disable-all
rubygems와 RUBYOPT 옵션을 비활성화한다
--disable-gems
require로 루비젬을 자동으로 로드하지 않도록 한다. 반대 옵션으로 --enable-gems 옵션이 있다.
--disable-rubyopt
루비가 RUBYOPT 환경 변수를 참조하지 않도록 한다. 이는 보안이 필요한 환경에서 사용할 수 있다.반대 옵션으로 --enable-rubyopt 옵션이 있다.
--dump option....
루비의 내부 상태를 담은 다양한 정보를 덤프한다. options.. 에는 쉼표(,)나 공백으로 구분되는 하나 이상의 옵션이 올 수 있다. 사용 가능한 옵션으로는 copyright, insns, parsetree, parsetree_with_comment, syntax, usage, version, yydebug가 있다. 이 옵션은 루비 코어 개발자들이 사용한다.
--enable-all
rubygems, RUBYOPT 옵션을 활성화한다.
--enable-gems
require로 루비젬을 자동으로 로드하도록 한다. 반대 옵션으로 --disable-gems 옵션이 있다.
--enable-rubyopt
루비가 RUBYOPT 환경 변수를 사용하도록 설정한다.
-E encoding, --encoding encoding, --encoding==encoding
외부 리소스에 대한 읽기와 쓰기에 대해 사용할 기본 문자 인코딩을 지정한다.
-e 'command'
command를 한 줄의 루비 소스 코드로 실행한다. 이 옵션을 여러 번 사용할 수 있으며, 한 프로그램의 여러 줄로 인식된다. 프로그램 파일이 생략되고 -e옵션이 존재하면 -e 옵션에 지정한 명령어를 실행하고 실행을 종료한다.
나머지 내용은 책을 참조하길..
인자 분석: ARGV와 ARGF
프로그램 파일 이름 뒤에 매개 변수는 프로그램 내에서 전역 변수 배열 객체 ARGV로 이용 가능하다.
ARGV.each { | arg | p arg }
이 파일을 다음처럼 실행해보자.
$ ruby -w test.rb "Hellow World" a1 1.6180
실행결과
"Hello World"
"a1"
"1.6180"
여기서 주의할 점은 C와는 달리 ARGV[0]이 프로그램의 첫 번째 매개 변수이지 프로그램 이름이 아니라는 점이다.
ARGF
명령행 프로그램에서 프로그램이 처리하려는 0개 이상의 파일목록을 받아오는 방법은 흔히 사용된다. 루비는 이를 위해 ARGF 라고 하는 넘겨받는 파일들에 쉽게 접근할 수 있도록 도와주는 객체를 제공한다. 프로그램이 실행되면 ARGF가 초기화되고 ARGV를 참조한다. 이는 참조이므로 ARGV를 변경하면 (예를 들어 옵션을 처리하고 삭제하면) ARGF에도 영향을 준다.
ARGF에서 읽어오거나, 표젼 입력을 읽어오면 루비는 ARGV의 첫 번째 요소의 이름을 가진 파일을 열고 여기에 I/O 작업을 수행한다.계속 읽어나가면 파일의 마지막에 다다를 것이고 이때 루비는 파일을 닫고 ARGV 배열의 다음 요소로 넘어가서 파일을 연다. 계속해서 파일을 읽고 모든 파일을 다 읽어 마지막 파일의 EOF에 다다를 것이다. ARGV가 비어 있다면 ARGF는 표준 입력으로부터 읽어올 것이다.
현재 읽고잇는 파일의 이름은 ARGF.filename 으로 얻어올 수 있고 현재 파일 객체는 ARGF.file 로 얻어올 수 있다. ARGF의 모든 줄 수는 ARGF.lineno를 통해 알 수 있으며, 현재 파일의 줄 번호는 ARGV.file.lineno를 통해 알 수 있다. 다음은 이러한 정보를 사용하는 프로그램 예제다.
while line = gets
printf " %d: %10s[%d] %s", ARGF.lineno, ARGF.filename, ARGF.file.lineno, line
end
이를 실행하면 파일 이름들을 넘겨주고 그 안에 들어 있는 파일 내용을 복사할 것이다.
$ ruby copy.rb testfile otherfile
1: testfile[1] This is line one
2: testfile[2] This is line two
3: testfile[3] This is line three
4: testfile[4] And so one...
5: otherfile[1] ANOTHER LINE ONE
6: otherfile[2] AND ANOTHER LINE TWO
7: otherfile[3] AND FINALLY THE LAST LINE
제자리 편집
제자리 편집(in-place editing)은 펄에서 유래한 트릭이다. 이는 명령행에서 넘겨진 파일을 바로 편집할 수 있도록 해 주며 원래 파일의 콘텐츠를 별도로 백업 해서 보관해 준다. 제자리 편집을 사용하려면 루비에 백업 파일 확장자를 지정해 줘야 한다. 이는 -i [ext] 명령행 옵션이나 코드상에서 ARGF.inplace_mode=ext를 통해 할 수 있다.
이제 명령행을 통해 파일을 읽어올 때 루비는 원래 파일의 이름을 변경하고 주어진 백업 확장자를 덧붙인다. 이를 통해 원래 이름을 가진 새로운 파일을 생성하고 이를 열어서 표준 출력에 쓴다. 다음과 같이 작성할 수 있다.
while line = gets
puts line.chomp.reverse
end
이 프로그램은 다음과 같이 사용한다.
$ ruby -i.bak reverse.rb testfile otherfile
이제 testfile 과 otherfile은 각 줄이 뒤집어 졌으며 원래의 파일은 testfile.bak과 otherfile.bak 에서 찾을 수 있다.
프로그램 종료
Object#exit 메서드는 프로그램을 종료하고, 운영 체제에 종료 상태값을 반환한다. 하지만 다른 언어와 달리 exit 메서드가 프로그램을 즉시 종료시키지 않는다. Object#exit는 일단 SystemExit 예외를 발생시키는데 이를 잡아서 등록된 at_exit 메서드와 객체 소멸자를 포함한 정리 동작을 수행한다.
환경 변수
변수 ENV를 사용하면 운영 체제에 정의된 환경 변수에 접근할 수 있다. 이 변수에는 Hash 메서드를 사용할 수 있다.
ENV['SHELL']
ENV['HOME']
ENV['USER']
ENV.keys.size
ENV.keys[0, 4]
일부 환경 변수의 값은 루비가 처음 실행될 때 읽는다. 이러한 변수들의 값은 인터프리터의 동작 방식을 변화시킨다.
메모리와 관련된 환경변수는 다음과 같다.
RUBY_THREAD_VM_STACK_SIZE
스레드를 만들 때 VM 스택 크기를 지정한다. 128KB(32비트 CPU) 256KB(64비트 CPU)
RUBY_THREAD_MACHINE_STACK_SIZE
스레드를 만들 때 머신 스택 크기를 지정한다. 512KB(32비트 CPU) 1024 KB(64비트 CPU)
RUBY_FIBER_VM_STACK_SIZE
파이버를 만들 때 VM 스택 크기를 지정한다. 64KB 또는 128KB
RUBY_FIBER_MACHINE_STACK_SIZE
파이버를 만들 때 머신 스택 크기를 지정한다. 256KB 또는 512KB
시스템상의 환경 변수들의 현재 값은 RubyVM::DEFAULT_PARAMS 에서 확인할 수 있다.
끄읕