こんにちは、フルスタックエンジニアのryuです。
今回の記事では、Linuxでよく使うexportコマンドについて解説します。
Linuxを勉強していると、
「環境変数って何?」
「VAR=valueとexport VAR=valueは何が違うの?」
「exportで設定した値は、ターミナルを閉じても残るの?」
と疑問に思うことがあります。
exportは、シェルで定義した変数を、そのシェルから起動するコマンドやスクリプトなどの子プロセスへ引き継げるようにするためのコマンドです。
最初は少し分かりづらいのですが、実際に変数を作って確認してみると仕組みが見えてきます。
この記事では、exportの基本的な使い方から、環境変数の確認方法、PATHの追加、設定を永続化する方法まで順番に解説します。
Linuxのexportコマンドとは?¶
exportは、シェル変数に「子プロセスへ引き継ぐ」という属性を付けるためのコマンドです。
よく使う書き方は次のとおりです。
export 変数名=値
例えば、NEW_VARという変数にHello worldを設定する場合は、次のように実行します。
export NEW_VAR="Hello world"
設定した値は、echoコマンドで確認できます。
echo "$NEW_VAR"
実行結果は次のようになります。
Hello world
Linuxの設定手順などを見ていると、
export PATH=...
export JAVA_HOME=...
export AWS_REGION=...
のようなコマンドが出てくることがあります。
このように、プログラムやコマンドから参照したい値を環境変数として渡すときにexportを利用します。
そもそも環境変数とは?¶
exportを理解するには、まず環境変数について知っておく必要があります。
環境変数とは、OS上で動くプログラムが参照できる設定値のようなものです。
例えば、Linuxでは次のような環境変数があります。
HOME
PATH
USER
LANG
SHELL
HOMEにはユーザーのホームディレクトリ、PATHにはコマンドを探すディレクトリなどが設定されています。
実際に確認してみましょう。
echo "$HOME"
例えば、次のように表示されます。
/home/ryu
PATHも同じように確認できます。
echo "$PATH"
環境変数は、Linux自体だけではなく、PythonやJava、AWS CLIなど、さまざまなプログラムから利用されます。
シェル変数と環境変数の違い¶
ここがexportで一番分かりづらいところだと思います。
Bashでは、次のように書くだけでも変数を作れます。
MY_VAR="Hello"
これでも、
echo "$MY_VAR"
と実行すれば値は表示されます。
Hello
では、なぜexportが必要なのでしょうか。
MY_VAR="Hello"だけで作った変数は、基本的に現在のシェル内で利用するシェル変数です。
一方、
export MY_VAR="Hello"
とすると、そのシェルから起動した子プロセスにもMY_VARを引き継げるようになります。
イメージすると次のようになります。
現在のBash
│
│ export MY_VAR="Hello"
│
├─ Python
│ └─ MY_VARを参照できる
│
├─ シェルスクリプト
│ └─ MY_VARを参照できる
│
└─ 別のBash
└─ MY_VARを参照できる
つまり、exportは単純に「変数を作る」というより、その変数を子プロセスにも渡せるようにする役割を持っています。
exportコマンドの基本的な使い方¶
環境変数を設定するときは、次のように実行します。
export NEW_VAR="Hello world"
変数名と値の間にスペースは入れません。
次の書き方は正しくありません。
export NEW_VAR = "Hello world"
Linuxのシェルでは、スペースにも意味があります。
基本的には、
変数名=値
と続けて書くと覚えておきましょう。
値にスペースが含まれる場合は、次のようにダブルクォートで囲むと分かりやすいです。
export MESSAGE="Hello Linux"
確認してみます。
echo "$MESSAGE"
Hello Linux
変数を作ってからexportすることもできる¶
次のように、先にシェル変数を作ることもできます。
MY_VAR="Hello"
そのあと、
export MY_VAR
と実行すれば、MY_VARを子プロセスへ引き継げる環境変数として扱えます。
つまり、次の2つはよく似た使い方になります。
MY_VAR="Hello"
export MY_VAR
export MY_VAR="Hello"
普段は1行で書ける後者の方が簡単ですが、「exportは変数を子プロセスへ渡せるようにするもの」と理解するには、2行に分けて考えると分かりやすいと思います。
exportした環境変数を確認する¶
設定した環境変数を確認する方法はいくつかあります。
よく使うのは次の3つです。
echoprintenvenv
echoで特定の変数を確認する¶
特定の変数だけ確認したい場合は、echoが簡単です。
echo "$NEW_VAR"
変数名の前に$を付けることで、その変数に入っている値を展開できます。
printenvで確認する¶
printenvを実行すると、現在の環境変数を一覧で確認できます。
printenv
特定の環境変数だけ確認することもできます。
printenv HOME
printenv PATH
envで確認する¶
envでも環境変数を一覧表示できます。
env
環境変数が多い場合は、grepと組み合わせると探しやすくなります。
env | grep PATH
環境変数を確認する方法については、こちらの記事でも詳しく解説しています。
関連:【Linux】環境変数を確認する方法を解説!”envコマンドとprintenvコマンド”
export -pでexportされている変数を確認する¶
Bashでは、export -pを使って、現在exportされている変数を確認できます。
export -p
実行すると、次のような形式で表示されます。
declare -x HOME="/home/ryu"
declare -x PATH="..."
declare -x USER="ryu"
環境によって表示内容は異なりますが、どの変数にexport属性が付いているのかを確認できます。
自分で設定した変数だけ探したい場合は、grepと組み合わせてもよいでしょう。
export -p | grep MY_VAR
export -nでexport属性を外す¶
-nオプションを使うと、変数そのものを削除せず、export属性だけを外せます。
例えば、次の環境変数を作ります。
export MY_VAR="Hello"
続いて、
export -n MY_VAR
と実行します。
これでMY_VARは現在のシェルには残りますが、新しく起動する子プロセスへ引き継ぐ対象ではなくなります。
そのため、
echo "$MY_VAR"
では値を確認できます。
変数自体を削除したい場合はexport -nではなく、unsetを利用します。
unset MY_VAR
export -nとunsetは動作が違うので注意しましょう。
export -fでシェル関数をexportする¶
Bashでは、-fオプションを使ってシェル関数をexportすることもできます。
まず、関数を作ります。
hello() {
echo "Hello Linux"
}
続いて、次のように実行します。
export -f hello
これで、子として起動したBashでも関数を利用できるようになります。
bash -c 'hello'
実行結果は次のとおりです。
Hello Linux
ただし、export -fは普段のLinux操作で頻繁に使うものではありません。
初心者のうちは、まず通常の環境変数を扱えるようになれば十分です。
PATHへディレクトリを追加する¶
exportの実例としてよく登場するのが、PATHの設定です。
PATHには、Linuxがコマンドを探すディレクトリが登録されています。
現在のPATHは次のように確認できます。
echo "$PATH"
例えば、/home/ryu/binをPATHへ追加したい場合は、次のように設定できます。
export PATH="$PATH:/home/ryu/bin"
ここで、
$PATH
を書いているのがポイントです。
現在設定されているPATHを残したまま、末尾へ/home/ryu/binを追加しています。
もし、
export PATH="/home/ryu/bin"
としてしまうと、もともと設定されていたPATHを上書きしてしまいます。
すると、普段使えていたコマンドが見つからなくなることもあります。
PATHを変更するときは、現在の値を残したまま追加しているか確認しましょう。
exportで設定した環境変数はいつまで残る?¶
ここも初心者がよく迷うところです。
ターミナルで、
export MY_VAR="Hello"
と実行しても、その設定がずっと保存されるわけではありません。
基本的には、そのシェルを終了すると設定した値は失われます。
新しいターミナルを開いたときにも同じ環境変数を使いたい場合は、利用しているシェルの設定ファイルへ記述します。
例えばBashであれば、環境に応じて~/.bashrcなどへ設定します。
export MY_VAR="Hello"
PATHを追加する場合なら、
export PATH="$PATH:$HOME/bin"
のように書けます。
設定ファイルを変更したあと、現在のシェルへ反映したい場合は、例えば次のように実行します。
source ~/.bashrc
ただし、どの設定ファイルが読み込まれるかは、利用しているシェルやログイン方法によって異なります。
「exportしたのに、新しいターミナルを開いたら消えた」という場合は、設定ファイルへ書いているか確認してみましょう。
1つのコマンドだけ環境変数を渡す方法¶
環境変数をずっと設定する必要がなく、「このコマンドを実行するときだけ値を渡したい」という場合もあります。
その場合は、次のようにコマンドの前へ変数を書けます。
MY_VAR="Hello" python app.py
この場合、MY_VARはpython app.pyを実行するプロセスへ渡されます。
現在のシェルへ長く設定しておく必要がない場合は、この書き方も便利です。
例えば開発環境と本番環境で設定値を変えたり、一時的に動作を確認したりするときに使えます。
パスワードや秘密情報をexportするときは注意する¶
アプリケーションの設定では、環境変数にAPIキーやパスワードなどを渡すことがあります。
ただし、
export PASSWORD="..."
のようなコマンドをそのまま入力すると、利用しているシェルの設定によってはコマンド履歴に残る可能性があります。
また、秘密情報を.bashrcなどへ平文で保存すれば、そのファイルを読める人から確認できてしまいます。
環境変数だから自動的に安全になるわけではありません。
本番環境で秘密情報を扱う場合は、利用しているクラウドや実行環境のシークレット管理機能なども検討しましょう。
exportコマンドの主なオプション¶
Bashでよく使うexportのオプションをまとめます。
| オプション | 説明 |
|---|---|
-p |
exportされている変数を表示する |
-n |
変数のexport属性を外す |
-f |
シェル関数をexport対象として扱う |
オプションの数は多くありません。
普段の操作では、
export 変数名=値
がほとんどなので、まずは基本形を覚えておけば大丈夫です。
exportコマンドは実際に動かして覚えよう¶
環境変数は、文章だけで理解しようとすると少し分かりづらいと思います。
まずは自分で次のコマンドを実行してみてください。
export MY_NAME="ryu"
echo "$MY_NAME"
printenv MY_NAME
続いて、
export -n MY_NAME
echo "$MY_NAME"
printenv MY_NAME
と実行すると、「変数自体は残っているけれど、export属性は外れている」という違いを確認できます。
さらに、
unset MY_NAME
echo "$MY_NAME"
まで試すと、export -nとunsetの違いも理解しやすくなります。
Linuxは、このようにコマンドを実際に入力して結果を確認すると、一気に分かりやすくなります。
Linuxを手を動かしながら学ぶならInfraAcademy¶
Linuxコマンドを覚えるときに、コマンド一覧だけを眺めて暗記しようとすると、なかなか身につきません。
私もLinuxを勉強し始めたころは、コマンドの意味を読んでも「結局いつ使うの?」となることがよくありました。
exportであれば、実際に環境変数を作って、echoやprintenvで確認してみる。PATHを変更したら、どのように値が変わったのか見てみる。
このように自分で操作して結果を確認する方が、Linuxは理解しやすいです。
InfraAcademyのLinux講座では、ブラウザ上のLinux環境を使いながら、ディレクトリやファイル操作、権限、ユーザーとグループ、ネットワークなどを順番に学べます。
自分のPCにLinux環境を作らなくてもコマンドを実行できるので、「Linuxを勉強したいけど、環境構築の段階でつまずいてしまった」という方にもおすすめです。
↓InfraAcademyの講座の一部です。
上記以外にも、ネットワークやAWS、サーバー構築など、インフラエンジニアに必要な内容を学べます。
まとめ¶
今回の記事では、Linuxのexportコマンドについて解説しました。
exportは、単純に環境変数へ値を入れるだけのコマンドではありません。
シェルで定義した変数を、そこから起動するコマンドやスクリプトなどの子プロセスへ引き継げるようにするために利用します。
まずは、次の使い方を覚えておきましょう。
export MY_VAR="Hello"
echo "$MY_VAR"
printenv MY_VAR
export -p
また、ターミナル上でexportした値は、基本的にそのシェルを終了すると失われます。毎回利用したい設定は、必要に応じて.bashrcなどの設定ファイルへ記述します。
exportは、PATHの設定やアプリケーションの設定値を渡すときなど、Linuxを使っているとさまざまな場面で登場します。
最初は「環境変数」という言葉が難しく感じるかもしれませんが、実際に変数を作って、子プロセスへ値が渡ることを確認すると理解しやすくなります。




