shebangでRubyスクリプトを実行可能にする
Unixライクなシステムでは、先頭行に#!
を書くことで、スクリプトを任意のプログラムで実行するように指定することができる。これをshebangと呼ぶ。
例えばRubyが/usr/bin/ruby
にインストールされているシステムなら、先頭行に以下のように書いてhello.rb
として保存し、実行権限を付与してやれば、このスクリプトをシェルから./hello.rb
のように実行することができる。
#! /usr/bin/ruby puts "Hello, World!"
shebangはruby
コマンドを使ってスクリプトを起動するときにも解釈される。これを利用してRubyスクリプトをいつも決まったコマンドラインオプションで実行させることもできる。Ruby 1.8を使っていてKCODE
を指定する場合に良く利用される。
#! /usr/bin/ruby -Ke puts "EUC-JPの日本語Rubyスクリプト"
複数の環境で動作させたいRubyスクリプトの場合は、環境によってRubyが何処にインストールされているかわからないことが問題になる。そのような場合はshebangで/usr/bin/env ruby
を指定することで、環境の違いに対応できる。env
はコマンドラインオプションで与えたプログラムを環境の差異を吸収して実行してくれるプログラムだ。
#! /usr/bin/env ruby puts "Hello, World!"
しかし、shebangに与えられるオプションは1つだけと決まっている。env
にはruby
というオプションを与えてしまっているため、Rubyにコマンドラインオプションを与えることができない。このような場合、以下のようにいったんシェルスクリプトをかませて、Rubyを実行する方法がある。これはRubyがスクリプト中の#!ruby
までを読み飛ばす挙動を利用したものだ。
#!/bin/sh exec ruby -S -x "$0" ${@+"$@"} #!ruby puts "Hello, World!"