⏱ 約 30 分
Part 1Chapter 06/Linux 基礎

環境変数とシェルの仕組み

シェルが「コマンドをどこで探すか」を決める PATH の読み方から、export で環境変数を作り、~/.bashrc に書いて永続化し、source で即反映するまでの 4 ステップを手を動かして身につけます。

所要時間約 30 分
章タイプstandard
前提知識Chapter 1-5(SSH / パス / ファイル操作 / grep / vim 編集)
使用機材踏み台 workstation01 + 演習用サーバ learner01
関連章前: Chapter 5「ファイルを書き換える(vim 入門)」/ 後: Chapter 7「ユーザとパーミッション」

「コマンドが動く裏側」を覗く

ここまでの章で、あなたはたくさんの コマンド を打ってきました。lscdgrepvim ── これらはどこから来て、なぜシェルが理解できるのでしょうか?

ls と打って Enter を押した瞬間、シェルは決まった手順で動いています。「探す場所」のリストを持っているのが PATH という変数で、これは 環境変数 と呼ばれる仕組みのひとつです。

この章では、「シェルが何を覚えていて、どう動いているか」 を理解します。これを掴むと:

・「command not found と言われる理由」が分かる
~/.bashrc に何を書けば設定が永続化されるか分かる
・Part 3 以降で SSH や nginx の設定をする前提が整う

この章を終えるとできること

環境変数のライフサイクル 4 ステップ を手に覚えます。

$ echo $PATH
$ env
① 見る
echo / env で
現状を確認
echo · env
$ export
PATH=$HOME/bin:$PATH
このシェルだけ
② 作る
export で
その場限り設定
export
$ vim ~/.bashrc
export PATH=...
次回も有効
③ 保存する
.bashrc に
追記して永続化
~/.bashrc
$ source
~/.bashrc
即反映
④ 反映する
source で今の
シェルに即反映
source

この 4 ステップが体になじむと、PATH を通したり、エイリアスを永続化したり、開発環境を整えるのが自由になります。

概念説明

1. シェルとは何か

workstation01learner01 に SSH ログインした瞬間、シェル というプログラムが起動します。Linux で最も一般的なのは bash(Bourne Again SHell)です。

bash
echo $SHELL    # → /bin/bash

2. 環境変数とは ── シェルが持っている「メモ」

環境変数 は、シェルが持っている 名前付きのメモ です。変数名=値 という形で覚えています。

変数名何を覚えているか
PATHコマンドを探す場所のリスト/usr/local/bin:/usr/bin:/bin
HOMEあなたのホームディレクトリ/home/student
USERあなたのユーザー名student
SHELL使っているシェルの場所/bin/bash
LANG言語・文字コード設定en_US.UTF-8
PS1プロンプトの表示形式\u@\h:\w\$

環境変数を参照するときは $ を頭に付けます。全部まとめて見たいときは env を使います。

bash
echo $HOME       # → /home/student
echo $USER       # → student
env | grep PATH    # PATH を含むものだけ(Ch4 のパイプを応用)

3. PATH ── コマンドを探す場所

ls と打ったとき、シェルは PATH に並んでいるディレクトリを 左から順に 探しに行きます。各ディレクトリを : で区切ったリストです。最初に見つかったものが使われます

bash
which ls     # → /usr/bin/ls       (ls の実体はここ)
which vim    # → /usr/bin/vim
which grep   # → /usr/bin/grep

command not found の正体

PATH のどこにも実行ファイルが見つからない」 という意味です。原因は 3 つに切り分けられます。
原因確認方法対処
そもそも入っていないパッケージ管理で探すapt install ... でインストール
入っているが PATH 外find / -name xxx 2>/dev/null
2>/dev/null = エラーメッセージを捨てる書き方)
PATH に追加する
タイプミスwhich 似た名前正しいスペルで打ち直す

4. 環境変数のライフサイクル

環境変数は どこに書くか で「どこまで生き残るか」が変わります。

設定方法生きる範囲
export VAR=value を打つ今のシェルだけ(ターミナルを閉じると消える)
~/.bashrc に書く今後そのユーザーで起動するシェル全部
/etc/environment に書く全ユーザー / システム全体(管理者用)

VAR=value だけだとシェル変数(その場限り)、export VAR=value だと環境変数(子プロセスにも渡る)になります。子プロセスとは、今のシェルから呼び出されたコマンドやスクリプトのこと(親から渡された値を子も知っている状態)。コマンドや別シェルから参照したいなら export を付ける、と覚えれば十分です。

5. .bashrc.bash_profile の違い

ここがハマりどころです。bash は起動の仕方によって 読むファイルが違います

ファイルいつ読まれるか
~/.bash_profileログインシェル(SSH で入った瞬間など)
~/.bashrcインタラクティブシェル(新しいターミナル / bash 起動など)
~/.profile~/.bash_profile が無いときのフォールバック
現場の合言葉: 迷ったら ~/.bashrc に書く。

多くの Linux ディストリビューションでは ~/.bash_profile の中で ~/.bashrcsource する構成になっているので、~/.bashrc に書けば両方のケースで反映されます。

6. source ── 設定を「今すぐ」反映する

~/.bashrc を編集しても、今動いているシェルには反映されません(次にログインしたとき初めて読まれる)。

bash
source ~/.bashrc       # 今のシェルに即座に反映
. ~/.bashrc            # 同じ(ドット 1 個でも source と同じ意味)

または、いったん exit して再 SSH すれば、新しいシェルが起動するときに .bashrc が読まれます。

試してみよう:自作スクリプトをコマンドのように使う

シナリオ: 「自分専用のスクリプト hello を作って、どこからでも hello と打って実行できるようにする」 ── 実際の現場でも、自作の運用スクリプトを ~/bin/ に置いて PATH を通す手順は頻出です。

🛟 演習の安全範囲

触るのは ~/bin/(新規作成)と ~/.bashrc(追記)だけ。~/.bashrc の元の中身は変更しません。
もし ~/.bashrc がおかしくなったら、追記した行を vim で削除すれば元に戻ります。

まず learner01 に入る

bash · workstation01 から SSH
ssh student@learner01

見る ── 現在の PATH を確認

: で区切られたディレクトリのリストが出ます。

bash
echo $PATH              # /usr/local/bin:/usr/bin:/bin:...
echo $HOME              # /home/student
echo $USER              # student
env | grep -i lang     # 言語設定

自作スクリプトを作る場所を用意

bash
mkdir -p ~/bin     # 自作スクリプトを置く慣例の場所

vim で簡単なスクリプトを書く

vim で ~/bin/hello を作成 → i でインサート → 以下を入力 → Esc:wq

vim ~/bin/hello の中身
#!/bin/bash
echo "こんにちは、$USER さん! (from learner01)"

実行権限を付けます(Ch7「ユーザとパーミッション」で詳しく扱う chmod +x です)。

bash
chmod +x ~/bin/hello

パスを指定して実行してみる

bash
~/bin/hello     # フルパスなら動く

hello だけで実行 → command not found を体感

bash
hello
# → bash: hello: command not found

PATH に ~/bin が含まれていないので、シェルが hello を見つけられません。which hello を打っても何も返ってきません。

もし command not found にならず hello が動いた人へ: 前回この演習を途中までやって ~/.bashrc に PATH を追記済みだと、ログイン時点で ~/bin が PATH に入っているため、ここはエラーになりません。それで正常です。「PATH に入っていれば名前だけで呼べる」というこの章の結論を、すでに体験できている状態です。次のステップは読んで流して構いません。

作る ── PATH に一時的に ~/bin を追加

bash
export PATH="$HOME/bin:$PATH"
echo $PATH                   # 先頭に /home/student/bin が追加されたか確認
hello                          # 今度は動く
which hello                    # /home/student/bin/hello

動きました。ただしこれは 今のシェルだけexit して再ログインすると消えます。

保存する ── ~/.bashrc に追記して永続化

vim で ~/.bashrc を開き、末尾(G でジャンプ → o で新しい行)に以下を追加して :wq

~/.bashrc の末尾に追加
# 自作スクリプト用
export PATH="$HOME/bin:$PATH"
2 回目の人へ(重複に注意): 前回この行を追記済みなら、もう一度足す必要はありませんgrep PATH ~/.bashrc で確認し、すでに同じ行があればそのまま次へ。同じ export PATH 行が 2 行あっても動作はしますが、無駄なので 1 行にしておきましょう。

反映する ── source で今のシェルに反映

bash
source ~/.bashrc       # 今のシェルに即反映
which hello             # /home/student/bin/hello
hello                    # 動く

これで、次回以降ログインしても hello がどこからでも実行できます。

詰まったら

💡 軽く方向だけ
「コマンドが見つからない」と「PATH に含まれていない」はだいたい同じ意味です。which コマンド名 で「どこから読まれているか」を確認、echo $PATH で「どこを探しているか」を確認。この 2 つを突き合わせると原因が見えます。
💡 具体的な手順
# 確認
echo $PATH                   # 探す場所のリスト
which hello                  # シェルが見ている実体

# 一時追加
export PATH="$HOME/bin:$PATH"

# 永続化
vim ~/.bashrc                # 末尾に export PATH="$HOME/bin:$PATH" を追記
source ~/.bashrc             # 即反映
$PATH の前後関係: PATH="$HOME/bin:$PATH" は「先頭に追加」で、自作スクリプトがシステム標準より優先されます(この章ではこちらを採用)。逆に PATH="$PATH:$HOME/bin" なら「末尾に追加」で、システム標準が優先。~ ではなく $HOME を使うと、どんな場面でも確実にホームディレクトリに展開されます。
✅ 答えを見る
mkdir -p ~/bin
vim ~/bin/hello
# vim 内で:
#!/bin/bash
echo "こんにちは、$USER さん!"
# 保存して終了

chmod +x ~/bin/hello

# 一時的に PATH 追加
export PATH="$HOME/bin:$PATH"
hello                          # 動作確認

# 永続化
vim ~/.bashrc                  # 末尾に export PATH="$HOME/bin:$PATH" を追記
source ~/.bashrc
which hello                    # /home/student/bin/hello
hello                          # 動く

ポイント: export で環境変数として設定、~/.bashrc で永続化、source で即反映。この 3 段階を意識すれば、設定の生存範囲が掴めます。

AI に相談

AI わからないところを自由に質問できます
この章の内容を踏まえて、Linux の基礎にやさしく答えます

修了確認

学んだことが身についたか、2 問だけ確認してみましょう。

問 1 · .bashrc と .bash_profile の違い
~/.bashrc~/.bash_profile は、それぞれ どんなタイミングで読まれる ファイルですか? また、「迷ったらどっちに書けばいい?」 という現場の合言葉に答えてください。
問 2 · command not found の原因切り分け
mycmd: command not found というエラーが出ました。原因として考えられる 3 つのパターン を挙げ、それぞれの 確認コマンド を答えてください。

次の章へ

次は Chapter 7「ユーザとパーミッション」 です。

ls -l を打つと出てくる -rw-r--r-- という謎の文字列、chmod 755 という呪文 ── これらは Linux の 権限システム です。Ch6 の演習で chmod +x を打ったのを覚えていますか? あれの仕組みを次に解剖します。