Bashで子プロセスに環境変数を渡す

Last-modified: Sat, 23 Jul 2016 00:33:57 JST (390d)
  • Bashなどシェルスクリプトでちょっとしたランチャーや処理を作るとき、シェル内の変数を子プロセスに渡したい時があります。
    渡す方法はパイプで渡したり、コマンドライン引数で渡したり方法があるのですが、簡単に渡したい時は環境変数経由で渡すと便利です。

Bashでの環境変数の渡し方

まずは、いきなりシェルを書く前に、挙動を確認しましょう。
シェルの画面に直接打ち込みます。

$ TEST_VALUE="環境変数"  # いったん変数に格納して
$ export TEST_VALUE      # exportでその変数を環境変数へセット

では、環境変数に登録されたか見てみます。

$ env | grep TEST_VALUE
TEST_VALUE=環境変数

ちゃんとセットされたようです。
では、いったんシェルを閉じ、再度コンソールを開きます。
次に、さきほどの処理をそのままシェルに書いてみます。

environment.sh

#!/bin/bash

TEST_VALUE="環境変数"  # いったん変数に格納して
export TEST_VALUE      # exportでその変数を環境変数へセット

では実行して、環境変数にセットされているか見てみましょう。

$ bash environment.sh | env | grep TEST_VALUE

恐らく何も出ないと思います。
シェルスクリプト内でセットされた環境変数は、そのシェルスクリプトのプロセス内でしか有効ではないので、シェルスクリプトが終了すると、その中でセットしていた環境変数は消えてしまいます。
では、シェルスクリプトの外で既に定義済みの環境変数(PATHとか)をシェルスクリプト内で書き換えた場合、どうなるのでしょうか?
実際やってみるとわかりますが、影響はありません。シェルスクリプト内で設定した環境変数はその中でしか影響しません。そして、その環境変数は親プロセスから子プロセスへ引き継がれます。 参考

BashからRubyをキックして、環境変数を受け取る

では、先ほど作成したシェルスクリプトで設定した環境変数を受け取るRubyスクリプトを作成します。
簡単にこんな感じで作ってみました。

get_env.rb

puts ENV["TEST_VALUE"]

先ほどのシェルスクリプトを修正します。

environment.sh

#!/bin/bash

TEST_VALUE="環境変数"  # いったん変数に格納して
export TEST_VALUE      # exportでその変数を環境変数へセット
ruby get_env.rb        # Rubyスクリプトをキック

では実行してみましょう

$ bash environment.sh
環境変数

こんな感じで、親プロセスでセットした環境変数を子プロセスで取得することができました。


Counter: 372, today: 2, yesterday: 1

このページの参照回数は、372です。