読者です 読者をやめる 読者になる 読者になる

決済API と Ruby 🍣 時々 Rails

Omise JapanのLead Developerです。OmiseやRubyのことをメインに書きます。

Ruby - 実行環境 コマンドラインオプション

Ruby 2.4.0 Ruby

docs.ruby-lang.orgさんのRubyの起動からコマンドラインオプションについて自己学習を含めて書いて見ました。 わかりにくいところもあるので、少し手を加えています。 今後、ちょいちょい例などを更新しようかと思います。

Rubyの起動

Rubyインタプリタの起動は以下の書式のコマンドラインにより行います。

ruby [ option ...] [ -- ] [ programfile ] [ argument ...]

それでは左から書式内容をみていきましょう。

option

後述のコマンドラインオプション のいずれかを指定します。 -- は、オプション列の終りを明示するため に使用できます。

programfile

Ruby スクリプトを記述したファイル(hoge.rbなど)です。これを省略したり- を指定した場合には標準入力を Ruby スクリプトとみなします。programfile が `#!‘ で始まるファイルである場合、特殊な解釈が行われます。詳細は後述のインタプリタ行の解釈で説明します。

argument

指定した文字列は組み込み定数 Object::ARGV の初期値として設定されます。 標準のシェルがワイルドカードを展開しない環境 (Win32)では、Ruby インタプリタが自前でワイルドカードを展開して Object::ARGV に設定します。 この場合ワイルドカードとして * , ? , [] , **/ が使用できます。 Win32 環境で、 ワイルドカード展開を抑止したい場合は引数をシングルクォート(‘) で括ります。

ためしに Object::ARGV に引数が入っているかを確認してみます。 以下をコマンドラインから実行。

ruby -v -d -rdate -e"p Object::ARGV" -- uri.rb "hello"

すると下記のように、Object::ARGV が最終行に配列(["uri.rb", "hello"])で出力されます。

ruby 2.4.0p0 (2016-12-24 revision 57164) [x86_64-darwin16]
Exception `LoadError' at /Users/akira/.rbenv/versions/2.4.0/lib/ruby/2.4.0/rubygems.rb:1345 - cannot load such file -- rubygems/defaults/operating_system
Exception `LoadError' at /Users/akira/.rbenv/versions/2.4.0/lib/ruby/2.4.0/rubygems.rb:1354 - cannot load such file -- rubygems/defaults/ruby
["uri.rb", "hello"]

コマンドラインオプション

optionフラグ 内容
-0 入力レコードセパレータ($/)を8進数で指定します。
数字を指定しない場合はヌルキャラクタがセパレータになります ($/ = “\0” と同じ)。
数の後に他のスイッチがあっても構いません。
-00で、パラグラフモード($/=“"と同じ)。
-0777で (そのコードを持つ文字は存在しないので)ファイルの内容を全部一度に読み込むモード($/=nilと同じ)に設定できます。
-a -n や -p と併用し、オートスプリットモードをONにします。オートスプリットモードでは各ループの先頭で $F = $_.splitが実行されます。 -n か -p を併用しない時にはこのオプションは意味を持ちません。
-n このフラグがセットされるとプログラム全体が sed -nやawk のように while gets do ... ; end で囲まれているように動作します。
-p -n フラグの動作にプラスして各ループの最後に変数 $_ の値を出力するようになります。
-C スクリプトの実行前に指定したディレクトリへ移動します。スクリプト実行後には、現在のディレクトリに戻ります。
ruby -C ~/ -e "p Dir.glob('*')"
=> ["dirname", ...]
-c スクリプトの文法エラーチェックを行い問題がなければ Syntax OK と出力します。
ruby -c hello.rb
=> Syntax OK
–copyright コピーライトを表示します。
ruby --copyright
=> ruby - Copyright (C) 1993-2016 Yukihiro Matsumoto
-d
–debug
デバッグモードでスクリプトを実行します。$DEBUG を true にします。Threadで例外が発生した場合に、プログラム自体を終了させる3つの方法のうちのひとつはこのデバッグモードです。
ruby -d -e "Thread.new { sleep 1; Thread.main.raise 'Error' }; begin; sleep; rescue => ex; puts ex.message; end"
=> Error
-Eex[:in]
–encodingex[:in]
デフォルトの外部と内部のエンコーディングを : 区切りで指定します。
ruby -EUTF-8:Shift_JIS -e "p 'やあ'"
=> \u3084\u3042
ruby -E:Shift_JIS -e "p 'やあ'"
=> \u3084\u3042
ruby -EShift_JIS: -e "p 'やあ'"
=> \u3084\u3042
-e script このオプションはevalと同じです、コマンドラインの文字列からスクリプトを実行します。 -e オプションをつけると引数からファイル名を取りません。
ruby -e "p 'Hello'"
=> Hello
-Fregexp -Fオプションでは -a オプションで $F = $_.split のregexを指定します。
-h
–help
-h オプションをつけるとオプションの概要が表示されます。 --help の場合はさらに多くの情報を表示します。
-i[extension] -i は inplace edit を行います。拡張子をしていすると元のファイルはその拡張子を追加して保存されます。拡張子をつけないとバックアップファイルはつくりません。
echo matz > /tmp/junk
cat /tmp/junk
=> matz

ruby -p -i.bak -e '$_.upcase!' /tmp/junk
cat /tmp/junk
=> MATZ

cat /tmp/junk.bak
=> matz
-Idirectory ファイルをロードするパスを追加します。指定したパスはRubyの配列引数 $: に追加されます。
ruby -I./ hello.rb
-l 行末の自動処理を行います。まず、$\ を $/ と同じ値に設定し、print での出力時に改行を付加するようにします。それから、 -n フラグまたは -p フラグが指定されていると gets で読み込まれた各行の最後に対して String#chop! を行います。
-rfeature スクリプト実行前に feature で指定されるライブラリを Kernel.#require します。 -n 、-p オプションとともに使う時に特に有効です。
ruby -rdate -e "p Date.new"
=> #<Date: -4712-01-01 ((0j,0s,0n),+0s,2299161j)>
-s スクリプト名に続く, - で始まる引数を解釈して, 同名のグローバル変数に値 を設定します。-- なる引数以降は解釈を行ないません。該当する引数は Object::ARGV から取り除かれます。
-S スクリプト名が / で始まっていない場合、環境変数 PATH の値を使ってスクリプトを探すことを指定します。これは、#! をサポートしていないマシンで、 #! による実行をエミュレートするためのフラグです。
-T[level] 不純度チェックを行います。level を指定すると安全度レベルをその レベルに設定します。level 省略時は 1 を指定したのと同じです。 CGIプログラムなどでは -T1 程度を指定しておく方が良いでしょう。 $SAFE に指定したレベルがセットされます。
-v
–verbose
はじめにrubyのバージョンを出力し、$VERBOSEにtrueをセットします。その後、他の引数があれば冗長モード(verbose)で実行します。
–version rubyのバージョンを出力します。ruby --version
=> ruby 2.4.0p0 (2016-12-24 revision 57164) [x86_64-darwin16]
-w $VERBOSEにtrueをセットし、冗長モードになります。
-W[level] 冗長モードを三段階のレベルで指定します。
-W0 : 警告を出力しない
-W1 : 重要な警告のみ出力(デフォルト)
-W2 or -W : すべての警告を出力する
-x[directory] メッセージ中のスクリプトを取り出して実行します。スクリプトを 読み込む時に、#! で始まり, "ruby"という文字列を含む行までを 読み飛ばします。スクリプトの終りはEOF(ファイル の終り), ^D (コントロールD)、 ^Z (コ ントロールZ)または予約語 __END__で指定されます。ディレクトリ名を指定すると、スクリプト実行前に指定されたディ レクトリに移動します。
-y
–yydebug
コンパイラデバッグモード。スクリプトを内部表現にコンパイルする時の構文解析の過程を表示します。

インタプリタ行の解釈

コマンドラインに指定したスクリプトが #! で始まるファイルで、その行に ruby という文字列を含まない場合、その行を読み飛ばします。#! に続く 文字列が ruby という文字列を含む行を見つけたらその行以下を Ruby スク リプトとして実行します。

例えば、以下のようなスクリプトを sh で実行すると sh から Ruby を起動することができます。

#!/bin/sh
exec ruby -x "$0" "$@"

#!ruby
p ARGV
puts "Hello, World!"

これは Ruby をスペースを含むパスにインストールした場合などに有用。

シェバン(shebang)での小技

ちょっとした小技?というところで、シェバンでもコマンドラインオプションを指定することができます。

#! /path/to/your/ruby -d
# ファイル一行目のシェバンでもコマンドラインオプションを使うことができる

p $DEBUG
# => true

あんまり使わないと思いますが、作業中に用途に合わせて使う場合もあるかも。

参考リンク

Rubyの起動 (Ruby 2.4.0)