やってみる

アウトプットすべく己を導くためのブログ。その試行錯誤すらたれ流す。

「環境変数」を読む

 知らなくても良さそう。

情報源

環境変数

環境変数 概要
RUBYOPT Rubyインタプリタにデフォルトで渡すオプションを指定します。
RUBYPATH Rubyインタプリタスクリプトファイル探索パスに加える。その優先度はPATHより上。
RUBYLIB Rubyライブラリの探索パス$:のデフォルト値の前にこの環境変数の値を付け足します。
RUBYSHELL この環境変数はmswin32版、mingw32版のrubyでのみ有効。Kernel.#systemでコマンドを実行するときに使用するシェルを指定します。この環境変数が省略されていればCOMSPECの値を使用します。
PATH Kernel.#systemなどでコマンドを実行するときに検索するパス。設定されていないときは/usr/local/bin:/usr/ucb:/usr/bin:/bin:.で検索されます。
RUBY_GC_* GC/チューニングのための環境変数 を参照。

RUBYPATH

 Rubyソースコード探索パスを追加する。

 テスト用rakefile環境変数に追加すれば思い通りの相対パスにできるかと思ったが、できなかった。

 rakefiletest/ディレクトリ直下にも作って試してみた。

rakefile

DIR_PJ = "#{File.dirname(File.dirname(__FILE__))}"
ENV['RUBYPATH'] = "#{DIR_PJ}:#{ENV['RUBYPATH']}"
...
  t.test_files = Dir["**/test_*.rb"]
...

test_lib.rb

require '../src/lib.rb'

 以下で実行する。

cd ./test
rake

 テスト用コードtest_lib.rbではテスト対象コード./src/lib.rbをロードする。このときのパスは相対パスである。基準になる位置はコマンド実行したカレントディレクトリである。今回はrakeコマンドにてテストを実行したのでそのパスとなる。rakeコマンドはカレントディレクトリ直下にあるrakefileを探して実行する。つまり./testである。それがそのままテスト用コードの相対パスの基準パスになる。

 先述のコードではENV['RUBYPATH'] = ...によってプロジェクトのルートを追加した。もし本当にそこを基準に探してくれたなら、テスト用コードのrequire./src/lib.rbでよかったはずだ。しかしそのパスで実行すると以下のようなエラーになる。

...
File does not exist: ./src/lib.rb
...

 RUBYPATHの説明をよくみると「-Sオプション指定時」とある。そのオプションがないどころか、rubyコマンドでなくrakeコマンドだから効果がなかったのだろう。

 たしか-Sオプションはシバンが効かない環境の対策だった。使いどころはほとんどなさそう。

対象環境

$ uname -a
Linux raspberrypi 5.10.52-v7l+ #1441 SMP Tue Aug 3 18:11:56 BST 2021 armv7l GNU/Linux