環境変数の基礎 - 設定と活用法
この記事でできるようになること
echo $VARやenvで 環境変数の中身を確認 できるexportで 自分専用の環境変数を設定 できるPATHの意味を理解し、「command not found」を 自力で解決 できる.bashrcで 次のログインでも残す設定 ができる
対象読者:Linuxの基本コマンド(pwd・cd・ls)は使えるが、$HOME や export の意味がピンとこない方。
導入:環境変数って何?
$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 |
HOME と PATH くらい。残りは「そういうのもあるんだ」で十分だよ。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. つまずきポイント集
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. ミニ課題で手を動かそう
課題 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!
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を忘れて「反映されない」と悩む