8
0

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?

More than 3 years have passed since last update.

えっ、環境変数ってコマンドの後ろに書いたらダメなんですか?

Last updated at Posted at 2020-02-20

勘違いしていたこと〜コマンドの後ろに環境変数書けるよね?〜

普段 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 スクリプトに環境変数が渡せないことに気づきました。

env_test.rb
#!/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 タスクを実行するときは、環境変数をコマンドの前に書いても後ろに書いても良い
  • それ以外の場合はコマンドの前に書く

変に使い分けて間違えても嫌なので、いっそのこと常に前に書く癖をつけた方が安心かも?

8
0
2

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
  3. You can use dark theme
What you can do with signing up
8
0

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?