外部コマンドとPATH変数の関係

1.外部コマンドの概要

  • 外部コマンド(External Command) は、シェルが呼び出す実行可能なプログラムで、システムの特定のディレクトリに格納されています。
  • これらのコマンドは、シェル内での組み込み機能ではなく、独立したプログラムとして存在します。

2.PATH変数の役割

  • PATH変数 は、システムが外部コマンドを実行する際に使用する検索パスを定義します。
  • PATH変数には、コロンで区切られたディレクトリパスのリストが含まれており、シェルはこれらのディレクトリを順番に検索して実行可能なファイルを見つけます。

3.外部コマンドの検索手順

検索手順

  1. コマンド実行時
    • ユーザーが外部コマンドを実行すると、シェルはそのコマンドを検索します。
  2. PATH変数の検索
    • シェルは PATH 変数に含まれる各ディレクトリを順に検索し、コマンドの実行可能ファイルを見つけるまで続けます。
  3. 検索成功
    • 最初に見つかった実行可能ファイルが実行されます。
  4. 検索失敗
    • PATH変数に含まれる全てのディレクトリでコマンドが見つからない場合、シェルは「コマンドが見つからない」とエラーメッセージを表示します。

dateコマンドの場合

dateコマンドの実行ファイルの場所は「which date」コマンドで確認できます。

$ which date
/usr/bin/date

dateコマンドが「/usr/bin/date」にあることが分かります。

「ls -l /usr/bin/date」コマンドで実行ファイルが、その場所に本当にあるのかを確認します。

$ ls -l /usr/bin/date
-rwxr-xr-x. 1 root root 62200 11月 17  2020 /usr/bin/date

確かに、「/usr/bin/date」にdateコマンドが存在します。

 本来、dateコマンドを実行するには、「/usr/bin/date」と入力する必要があります。「/usr/bin/date」と入力すると日時が表示されます。

$ /usr/bin/date
2024年  1月 28日 日曜日 14:10:06 JST

 しかし、毎回、コマンドを実行するたびに、コマンドまでのパス「/usr/bin/」を入力するには、煩わしいです。

 そこで、コマンド名だけを入力すれば、コマンドを実行できる仕組みが備わっています。その仕組みですが、シェルは組み込みコマンドではなく、外部コマンドであれば、PAHT変数に格納されているディレクトリを左から順に検索していきます。

$ echo $PATH
/usr/local/bin:/usr/local/sbin:/usr/bin:/usr/sbin:/bin:/sbin:/home/user01/.local/bin:/home/user01/bin

 コマンド名に一致する実行ファイルがあれば、それを実行します。PATH変数の中に「/usr/bin/」があるため、dateコマンドは、わざわざ「/usr/bin/date」と入力しなくとも「date」と入力するだけで実行できるのです。

組み込みコマンドと外部コマンドの両方にある場合

 コマンドによっては、組み込みコマンドと外部コマンドの両方にある場合があります。シェルによって組み込みコマンドが異なるためです。両方にある場合は、一般的には組み込みコマンドの方が優先されるようになっています。

4.PATH変数の設定と変更

  • PATH変数はユーザーの環境設定ファイル(.bashrc.bash_profileなど)に設定されます。
  • export PATH=$PATH:/新しい/ディレクトリ‘ のようにして PATH に新しいディレクトリを追加できます。

5.PATH変数の確認

  • echo $PATHコマンドを使用して、現在のPATH変数の値を表示できます。

6.セキュリティ上の注意

  • PATH 変数の悪意のある変更は、セキュリティリスクとなり得ます。不適切なディレクトリを ‘PATH‘ に含めないように注意が必要です。

7.

  • ユーザーが ‘/usr/local/bin‘ に新しいコマンドを配置し、それを実行可能にするには、’export PATH=$PATH:/usr/local/bin‘ のようにPATH 変数を変更します。
$ export PATH=$PATH:/usr/local/bin

 これらのポイントを理解することで、ユーザーが外部コマンドを効果的に利用し、システムがそれらを見つける手順を把握できます。