このページで解説している内容は、以下の YouTube 動画の解説で見ることができます。

Linux基礎:コマンドとパス

コマンドとパス

 Linux システムでコマンドを実行するとき、そのコマンドがどのように解釈され、どこから実行ファイルが呼び出されるのかを理解することはとても重要です。コマンドには シェルに組み込まれたコマンド(組み込みコマンド) と、システム上にある実行ファイルとして存在する 外部コマンド の2種類があります。

 例えば cdexport はシェルに内蔵された組み込みコマンドですが、lsdate は外部コマンドです。シェルはコマンドが入力されると、まず組み込みコマンドかどうかを確認し、そうでなければ PATH 環境変数 に定義されたディレクトリを順番に探索して実行ファイルを探します。この PATH の仕組みを コマンドサーチパス と呼びます。

 ここでは、組み込みコマンドと外部コマンドの違い、PATH の仕組み、そして実際のコマンド探索の流れを具体例を交えながら詳しく解説します。

1.コマンドの種類

1.1. 組み込みコマンド

 組み込みコマンドはシェルに最初から含まれており、外部プログラムを呼び出さずにその場で実行できます。

代表的な bash の組み込みコマンドは以下のとおりです。

コマンド説明
aliasエイリアスを作成・表示する。
bgジョブをバックグラウンドで実行する。
cdディレクトリを移動する。
echo引数を表示する。
exitシェルを終了する。
export環境変数を設定する。
fgジョブをフォアグラウンドで実行する。
historyコマンド履歴を表示する。
jobs実行中のジョブを一覧表示する。
killプロセスにシグナルを送る。
pwd現在の作業ディレクトリを表示する。
unaliasエイリアスを削除する。

1.2. 外部コマンド

 外部コマンドは、システム上の /bin/usr/bin などに保存されている実行可能ファイルです。lscp など日常的に使う多くのコマンドはこちらに分類されます。

使用例:外部コマンドの場所を確認

[user@rocky9 ~]$ which ls
alias ls='ls --color=auto'
	/usr/bin/ls

この例では ls コマンドが /usr/bin/ls に存在することがわかります。

2.PATH とコマンド探索

2.1. PATH 変数の役割

コマンドを入力すると、シェルは以下の順序で処理を行います。

  1. 組み込みコマンドかどうかを確認
  2. 外部コマンドであれば、環境変数 PATH に格納されたディレクトリを順番に探索

PATH の内容を確認するには以下のコマンドを使います。

[user@rocky9 ~]$ echo $PATH
/home/user/.local/bin:/home/user/bin:/usr/local/bin:/usr/local/sbin:/usr/bin:/usr/sbin

 この場合、シェルは /home/user/.local/bin/home/user/bin/usr/local/bin/usr/local/sbin/usr/bin/usr/sbin の順にコマンドを探します。

2.2. 実行ファイルの確認

例:date コマンドの確認

[user@rocky9 ~]$ ls -l /usr/bin/date
-rwxr-xr-x. 1 root root 106344  5月  2 17:31 /usr/bin/date

実行可能ファイルが存在していることがわかります。

2.3. 絶対パスでの実行

 PATH に含まれていなくても、絶対パスを指定すれば実行可能です。※dateコマンドはPATHに含まれています。

[user@rocky9 ~]$ /usr/bin/date
2025年  9月  5日 金曜日 01:11:59 JST

3.PATH の違いによる挙動

3.1. 一般ユーザーと root ユーザー

システムによって PATH の内容はユーザー権限で異なります。

一般ユーザーの PATH

[user@rocky9 ~]$ echo $PATH
/home/user/.local/bin:/home/user/bin:/usr/local/bin:/usr/local/sbin:/usr/bin:/usr/sbin

 Rocky LinuxのGUIでは、一般ユーザにも/usr/sbin という、システム管理用のディレクトリが含まれています。

root ユーザーの PATH

[user@rocky9 ~]$ su -
パスワード:
[root@rocky9 ~]# echo $PATH
/root/.local/bin:/root/bin:/usr/local/sbin:/usr/local/bin:/usr/sbin:/usr/bin

 一般的に、root ユーザーには /usr/sbin/sbin など、システム管理用のディレクトリが含まれています。※上の例では/sbin は含まれていません。

3.2. 実行されるシェルスクリプトのパス

 ホームディレクトリに「bin」ディレクトリを作成し、シェルスクリプトを(today.sh)を作成します。シェルスクリプトについては、次のコンテンツで詳しく解説します。

[user@rocky9 ~]$ mkdir bin
[user@rocky9 ~]$ nano bin/today.sh

today.shの内容

today.sh に以下の内容を入力します。

#!/bin/bash
date

実行権限を付与して、カレントディレクトリを確認します。

[user@rocky9 ~]$ chmod 755 bin/today.sh 
[user@rocky9 ~]$ pwd
/home/user

today.shを実行します。

[user@rocky9 ~]$ today.sh 
2025年  9月  5日 金曜日 16:03:15 JST

 today.shは、/home/user/binの中にあり、カレントディレクトリが、/home/userなのでbin/today.shとしないと、実行できないはずなのに、実行できています。

 それは、user の環境変数PATH内に「/home/user/bin」があり、環境変数 PATH に格納されたディレクトリを順番に探索して、today.sh を見つけることができたからです。

それでは、root ユーザーに切り替えて次のように today.sh を呼び出してみます。

[user@rocky9 ~]$ su -
パスワード:
[root@rocky9 ~]# today.sh
bash: today.sh: コマンドが見つかりませんでした...

today.sh を見つけることができません。

 それは、rootユーザーの環境変数PATHに「/home/user/bin」がなく、このスクリプトを見つけることができなかったからです。

 このように、環境変数PATHの内容によって、実行できるコマンドと実行できないコマンド、さらに実行できるシェルスクリプトと実行できないシェルスクリプトがでてきます。

4.確認用の主なコマンド

コマンド書式主なオプション説明
whichwhich コマンド名なしコマンドの実行ファイルの場所を表示
typetype コマンド名なし組み込みか外部コマンドかを判定
echoecho $PATHなし現在の PATH を表示
lsls [パス]-lファイルの詳細を表示

例:組み込みコマンドの確認

[root@rocky9 ~]# type cd
cd はシェル組み込み関数です

まとめ

  • コマンドには 組み込みコマンド外部コマンド がある。
  • 外部コマンドは PATH 変数に定義されたディレクトリから検索される。
  • PATH の内容はユーザー権限によって異なり、一般ユーザーには管理用コマンドのディレクトリが含まれないことがある。
    ※GUIのRocky Linuxには含まれている。
  • whichtype を利用すると、コマンドの所在や種類を確認できる。

 この仕組みを理解することで、コマンドやシェルスクリプトが「見つからない」といったトラブルを解決できるだけでなく、自分の環境に合わせて PATH をカスタマイズすることも可能になります。