環境変数の基礎 - 設定と活用法

環境変数の基礎 - 設定と活用法

この記事でできるようになること

  • echo $VARenv環境変数の中身を確認 できる
  • export自分専用の環境変数を設定 できる
  • PATH の意味を理解し、「command not found」を 自力で解決 できる
  • .bashrc次のログインでも残す設定 ができる

対象読者:Linuxの基本コマンド(pwd・cd・ls)は使えるが、$HOMEexport の意味がピンとこない方。

導入:環境変数って何?

リナ: ライニー先輩、教科書に $HOME とか $PATH ってよく出てくるんですけど、これって何ですか?$マークが付いてて呪文みたいで…
ライニー先輩: いいところに気づいたね。それは「環境変数」って呼ばれるものだよ。簡単に言うと、シェルが覚えている「名前付きのメモ書き」 みたいなもの。
リナ: メモ書き、ですか?
ライニー先輩: そう。たとえば「私のホームディレクトリは /home/lina だよ」って情報を、HOME という名前で覚えてある。だから $HOME と書けば、その中身(/home/lina)が呼び出されるってわけ。

結論(実務の型)

  • 中身を見たいだけ → echo $VAR または env | grep VAR
  • 自分のシェルだけで使いたい → export VAR=値
  • 次のログインでも残したい → ~/.bashrc に書く
  • command not found の8割は PATH が原因

前提(対象環境)

  • OS:Ubuntu / 他 Linux 一般
  • シェル:bash(zsh でもほぼ同じ)
  • ターミナルで $ プロンプトが表示されている状態

1. 環境変数を見てみよう

ライニー先輩: まずは「読む」ところから。設定するより先に、今何があるかを見るのが安全だよ。

1-1. 1 つの変数を見る:echo $VAR

$ echo $HOME
/home/lina
$ echo $USER
lina

ここがポイント

  • $ を付けると「変数の中身に展開する」という意味になる
  • $ を付けずに echo HOME だと、ただ「HOME」という文字列が表示されるだけ
  • 変数名は 大文字 が慣例(必須ではないが揃えると見やすい)
リナ: あ、$ 付けるかどうかで全然違うんですね!
ライニー先輩: そう。これがしょっぱなのつまずきポイントなんだよ。「$ は中身を呼び出すスイッチ」って覚えておけば大丈夫。

1-2. 全部の環境変数を見る:env / printenv

$ env
SHELL=/bin/bash
USER=lina
HOME=/home/lina
PATH=/usr/local/bin:/usr/bin:/bin
LANG=ja_JP.UTF-8
PWD=/home/lina
...

出力が長いときは env | less でページ送り、env | grep PATH で絞り込みが定番。

1-3. よく見る環境変数

変数名 意味
HOME 自分のホームディレクトリ /home/lina
USER 現在のユーザー名 lina
PATH コマンドを探しに行くディレクトリ群 /usr/local/bin:/usr/bin:/bin
SHELL 使っているシェル /bin/bash
LANG 言語・文字コードの設定 ja_JP.UTF-8
PWD 今いるディレクトリ(pwd と同じ) /home/lina/work
リナ: たくさんありますね…全部覚えなきゃダメですか?
ライニー先輩: 全然。実務で意識するのは HOMEPATH くらい。残りは「そういうのもあるんだ」で十分だよ。

2. 自分で設定する:代入と export

ライニー先輩: 次は自分で設定する番。ここに 「ハマりやすい落とし穴」 があるから、ゆっくりいくよ。

2-1. ただの代入(シェル変数)

$ MY_NAME=lina
$ echo $MY_NAME
lina

= の両側にスペースを入れないMY_NAME = lina だと「MY_NAME というコマンドを実行」と解釈されてエラーになる。Linuxあるあるの初心者事故。

2-2. export で「環境変数」に昇格

$ MY_NAME=lina
$ export MY_NAME

または一気に:

$ export MY_NAME=lina
リナ: 代入と export って、何が違うんですか?同じに見えますけど…
ライニー先輩: 大事な質問!代入だけだと、そのシェルの中でしか使えないんだ。子プロセス(そこから実行したコマンドやスクリプト)には引き継がれない。export を付けると「環境変数」になって、子プロセスにも見えるようになる。

2-3. 違いを実感する実験

$ MY_VAR=hello
$ bash -c 'echo $MY_VAR'

(空行=何も出ない)

$ export MY_VAR=hello
$ bash -c 'echo $MY_VAR'
hello

鉄則: スクリプトや別コマンドに値を渡したいときは必ず export。自分のメモ用なら = だけでもOK。

2-4. 変数を消したい

$ unset MY_VAR
$ echo $MY_VAR

unset で削除。ただし現在のシェル内だけ。.bashrc に書いた設定は、そちらを編集しないと消えない。

3. PATH:一番大事な環境変数

リナ: command not found ってよくエラーが出るんですけど、これも環境変数と関係あるんですか?
ライニー先輩: ドンピシャ。PATH の理解がそのまま command not found の解決につながるよ。

3-1. PATH の中身を見る

$ echo $PATH
/usr/local/sbin:/usr/local/bin:/usr/sbin:/usr/bin:/sbin:/bin

ここがポイント

  • : で区切られたディレクトリの並び
  • コマンドを打つと、シェルは 左から順に これらのディレクトリを探す
  • 最初に見つかった同名コマンドが実行される

3-2. 「どこにあるか」を調べる:which

$ which ls
/usr/bin/ls
$ which python3
/usr/bin/python3
リナ: ls って /usr/bin/ の中にいるんですね!
ライニー先輩: そう。だから ls と打つだけで動くのは、PATH/usr/bin が含まれてるから。もし PATH から /usr/bin を消したら、ls /usr/bin/ls ってフルパスで打たないと動かなくなる。

3-3. PATH を追加したい(自分のスクリプト置き場)

たとえば ~/bin を作って自作スクリプトを置きたい場合:

$ mkdir -p ~/bin
$ export PATH="$HOME/bin:$PATH"

$PATH を最後に必ず付けるexport PATH="$HOME/bin" だけだと 既存の PATH が全部消える → ほぼ全コマンドが command not found になる。事故率No.1の操作なので注意。

3-4. 順序が結果を変える

# 自作 ls を優先したい
$ export PATH="$HOME/bin:$PATH"

# 既存の ls を優先したい(自作を後回し)
$ export PATH="$PATH:$HOME/bin"

実務 Tips: 「PATH を編集して挙動が変わった」と思ったら which コマンド名 で実際に何が呼ばれているかを確認するのが最短ルート。

4. 永続化する:次のログインでも残す

リナ: export で設定したのに、ターミナルを閉じたら消えちゃったんですけど…
ライニー先輩: そう、それが「永続化」の話。export今のシェルセッションだけ 有効なんだ。次に開いたら忘れる。残したいなら設定ファイルに書く。

4-1. どのファイルに書く?

ファイル いつ読まれる 主な用途
~/.bashrc bashの対話シェル起動時(毎回) 個人の環境変数・エイリアス
~/.profile / ~/.bash_profile ログイン時に1回 環境変数(SSH ログイン等)
/etc/environment システム全体・全ユーザー システム共通(root権限要)

迷ったら ~/.bashrc。GUI のターミナルや WSL ではこれが最も確実に読まれる。

4-2. .bashrc に書く例

末尾に追記する:

# 自作スクリプト置き場
export PATH="$HOME/bin:$PATH"

# 言語設定
export LANG=ja_JP.UTF-8

# エディタの指定
export EDITOR=vim

4-3. 編集後すぐ反映させる:source

$ source ~/.bashrc

または:

$ . ~/.bashrc

source を忘れて「あれ、PATH が反映されない…」と悩む初心者は多い。設定ファイルを編集したら必ず source か再ログイン

リナ: source って何してるんですか?
ライニー先輩: 「このファイルを今のシェルで読み直す」って命令。普通にスクリプトを実行すると別プロセスで動くから、export しても親に戻ってこないんだよね。source だと現在のシェル内で実行されるから、設定がそのまま反映される。

5. つまずきポイント集

ライニー先輩: ここまでで基礎はOK。最後に 初心者が99%ハマるポイント を一気に潰しておこう。

5-1. $ を付け忘れる / 付けすぎる

# NG: ただの文字列「HOME」が表示される
$ echo HOME

# OK: 中身が展開される
$ echo $HOME

5-2. = の前後にスペース

# NG: コマンドとして解釈されてエラー
$ MY_VAR = hello

# OK
$ MY_VAR=hello

5-3. PATH の上書き事故

# 大事故!既存PATHが消える
$ export PATH="$HOME/bin"

# 正しい
$ export PATH="$HOME/bin:$PATH"

もし誤って上書きしてしまったら、新しいターミナルを開けば デフォルトの PATH に戻る。慌てて .bashrc を編集する前に深呼吸。

5-4. ダブルクォートとシングルクォートの違い

$ NAME=lina

# ダブルクォート:$NAME が展開される
$ echo "Hello $NAME"
Hello lina

# シングルクォート:そのまま表示される
$ echo 'Hello $NAME'
Hello $NAME

鉄則: 変数を展開したいときは ダブルクォート "..."。リテラル文字列にしたいときは シングルクォート '...'

5-5. export したのにスクリプトで使えない

シェルスクリプトを ./script.sh で実行している場合、親シェルの export 済み変数は引き継がれる。だが、新しいターミナルを開くと .bashrc を読み直すので、.bashrc に書いてなければ消える。

スクリプトに渡したい変数は 必ず .bashrc などに書いて永続化 しておくのが確実。

6. ミニ課題で手を動かそう

ライニー先輩: 知識だけだと身につかないから、3つだけ手を動かしてみよう。

課題 1:自分の名前を変数に入れて表示する

$ MY_NAME=(あなたの名前)
$ echo "Hello, $MY_NAME!"
ヒントを見る

= の前後にスペースを入れないこと。表示には "..." のダブルクォートで囲むと $MY_NAME が展開される。

課題 2:~/bin を作って PATH に追加する

$ mkdir -p ~/bin
$ echo 'export PATH="$HOME/bin:$PATH"' >> ~/.bashrc
$ source ~/.bashrc
$ echo $PATH

最初の方に /home/あなたの名前/bin が含まれていればOK。

課題 3:自作コマンドを動かしてみる

$ cat > ~/bin/hello << 'EOF'
#!/bin/bash
echo "Hello from my own script!"
EOF
$ chmod +x ~/bin/hello
$ hello
Hello from my own script!
リナ: できました!自分で作ったコマンドがどこからでも呼べるって、なんか嬉しいです。
ライニー先輩: それが PATH の威力だよ。これでもう command not found も怖くないね。

7. 今日のまとめ

コピペ用:環境変数チートシート

# 見る
echo $HOME                # 1つだけ
env                       # 全部
env | grep PATH           # 絞り込み
which コマンド名          # コマンドの場所

# 設定する
MY_VAR=値                 # シェル変数(このシェル内のみ)
export MY_VAR=値          # 環境変数(子プロセスにも継承)
unset MY_VAR              # 削除

# PATH 追加(事故防止)
export PATH="$HOME/bin:$PATH"   # 必ず :$PATH を末尾に

# 永続化
vim ~/.bashrc             # 末尾に export を追記
source ~/.bashrc          # 即反映

やってはいけないこと

  • export PATH="$HOME/bin" で既存 PATH を吹っ飛ばす
  • MY_VAR = 値 のように = 前後にスペースを入れる
  • '$HOME' のシングルクォートで括って展開されないと悩む
  • .bashrc を編集したのに source を忘れて「反映されない」と悩む

次に読む