勘違いしていたこと〜コマンドの後ろに環境変数書けるよね?〜
普段 Ruby on Rails で開発を行っているのですが、rails では以下のように、コマンドの後ろに環境変数を付けることができます。
# 環境変数 RAILS_ENV を一時的に "test" に変えてから DB を作成する。
$ bundle exec rails db:create RAILS_ENV=test
また、経験上 ↓ のように コマンドの前 に指定できることも知っていました。
$ RAILS_ENV=test bundle exec rails db:create
このことから、僕は Linuxのシェルはコマンドの前か後ろに環境変数を指定できる ものだと思い込んでおり、 その日の気分で前につけたり後ろにつけたり してました。
あれ、なんかおかしいな
先日、後置だと ruby スクリプトに環境変数が渡せないことに気づきました。
#!/usr/bin/env ruby
puts "APP_ENV: #{ENV['APP_ENV']}"
# NG
$ ./env_test.rb APP_ENV=hoge
APP_ENV:
↓ のように前置にするとうまく渡せます。
# OK
$ APP_ENV=hoge ./env_test.rb
APP_ENV: hoge
調べてみると、bashで環境変数をexportせずにシェルスクリプトを実行したい場合はコマンドの前に記述することで代替できる という記事が。
えっ、後ろには書けないの・・・?
なんで db:create とかは後ろに環境変数を書けるのか
でも db:create とか db:migrate は後ろに書けるじゃーん!なんでー!と思って更に調べました。
すると rails のコマンドを使うときに環境変数を後ろに書けるのは、rake が引数として VAR=VALUE
を受け取り、それを環境変数にセットしてるから ということが分かりました。
https://github.com/ruby/rake/blob/master/doc/command_line_usage.rdoc
rake のおかげだったんだ・・・
まとめ
- rake タスクを実行するときは、環境変数をコマンドの前に書いても後ろに書いても良い
- それ以外の場合はコマンドの前に書く
変に使い分けて間違えても嫌なので、いっそのこと常に前に書く癖をつけた方が安心かも?