コマンドの使い方は知っていても、どこにあるコマンドが実行されているかはあまり意識していないかもしれません。ディレクトリとパスについての理解が進んだところで、今回は環境変数PATHとコマンドの種類について理解を深めていきましょう。
前回の「ディレクトリに親しもう」では、Linuxでよく使われているディレクトリとして「/lib」や「/bin」「/usr/bin」などの名前を紹介しました。「ls」や「grep」などのコマンド群は、主に「/bin」と「/usr/bin」に、「shutdown」や「ip」「ifconfig」のようなシステム管理に使われるコマンドは「/sbin」と「/usr/sbin」にあります。
このように、Linuxでは“コマンドファイルは「/bin」に置く”という習慣があります。ですが、これは必須ではありません。
Linuxでは(WindowsでもOS Xでも同じですが)、データもコマンドも全て“ファイル”としてHDDやSSDなどの記憶媒体に保存されます。主にデータとして使われるファイルは「データファイル」、設定が記録されているファイルは「設定ファイル」などと呼ばれますが、用途によって呼び分けられているだけで“ファイルはファイル”です。
その中でも、コマンドとして実行できるファイルは「コマンドファイル」、あるいは実行できるという意味で「実行可能ファイル(executable file)」「実行ファイル」などと呼ばれています(※)。
※人間がC言語などのプログラミング言語で書いたプログラムを「ソースコード」と呼ぶことがありますが、これに対し、OSが実行できる機械語の状態に翻訳(コンパイル)した状態は「バイナリコード」と呼ばれます。このバイナリコードになったファイルの置き場が「bin」です。ただし、実際にはテキストで書かれたスクリプトファイルも混ざっています。ファイルがテキストかバイナリか、などのファイル形式は「file」コマンドで調べることができます。
ファイルを実行するためには幾つかの条件があります。
まず、最初の条件は、当然ですがファイルの中身が「実行可能な内容である」ことです。例えば、Windows用の実行ファイルをLinux環境に持ってきても、通常はそのままでは実行できません。
次の条件は「実行可能属性」が“有効”になっていることです。「実行可能フラグが立っている」と表現することもあります。
実行可能フラグが立っているとは、「このファイルは実行可能です、実行してもよいですよ」という印が付いているファイルということです。この実行可能フラグは、ファイルの属性を変更する「chmod」コマンドで変更することができます。
実行可能フラグが立っているファイルは、「ls -l」コマンドでリスト表示した際、先頭の属性部分に「x」という文字が表示されます(「ls -l」コマンドの詳しい使い方は後日あらためて取り上げます)。
これでファイルそのものの条件はそろいました。コマンドラインでコマンドファイルを実行する最後の条件は、そのコマンドファイルを「パス付きで指定する」ことになります。
「コマンドファイルをパス付きで指定する」ということは、例えば「ls」コマンドならば「/bin/ls」と入力する、ということになります。しかし、よく使うコマンドを毎回パス付きで指定するのは非常に面倒です。
Linuxでは、「コマンドサーチパス(コマンド検索パス)に登録してあるディレクトリにあるファイルは、パス名を省略してよい」という決まりになっています。「パス」だけで、このコマンドサーチパスを指すこともあります。
コマンドサーチパスは、「PATH」という名前の「環境変数」に保存されています。環境変数は、コマンドを実行している環境、すなわちOS全体で参照できる変数ということです。“PATHという変数”の内容は、「echo $PATH」コマンドで確認できます(※)(画面1)。
※「echo」はその名の通り、指定した内容を“こだま”のように返してくれるコマンドです。「echo hello」と実行すれば「hello」、「echo $変数名」と実行すれば変数の中身が表示されます。
PATHには複数のディレクトリがセットされており、ディレクトリとディレクトリは「:」記号で区切られています。前にある方が優先順位が高く、「/usr/local/bin:/bin:/usr/bin」と指定されている場合は、「/usr/local/bin」にある実行可能ファイルが優先されます。
ここで、コマンドのパス名指定について少し考えてみましょう。
「コマンドはファイルをパス名付きで指定しなくてはならない。ただし、PATHにあるものはパス名を省略できる」ということは、「パス名付きならば、PATHにない場所にあるコマンドでも実行できる」という意味にもなります。
例えば、「/tmp」というディレクトリにある「mycommand」という実行ファイルは、コマンドラインで「/tmp/mycommand」と指定することで実行できます。とにかく“パス付き”であればよいので、絶対パスでも、相対パスでも構いません。
lsコマンドやgrepコマンドなどで「grep ファイル名」のように指定する場合、カレントディレクトリにあるファイルはディレクトリ名を省略できます。しかし、コマンドとして実行する場合は省略できません。
ところで、Linuxなど、複数ユーザーの利用を前提としたUNIX系OSでは、「カレントディレクトリあるファイル=自分のファイル」とは限りません。
例えば、Aさんが「/tmp」に「ls」という名前の実行ファイルを保存したとします。Bさんが「/tmp」でいつも通りにlsコマンドを実行しようとして、カレントディレクトリのls、つまり「/tmp/ls」を実行しても、Bさんの望み通りの実行結果は得られません。悪意のあるファイルだったら大惨事になるでしょう。
従って、例えカレントディレクトリにあるファイルでも、コマンドとして実行する場合には「必ずパス名を指定しなければならない」という仕組みになっているのです。カレントディレクトリにあるファイルを実行するのであれば(そしてカレントディレクトリがPATHに含まれていないのであれば)、「./mycommand」のように指定します(※)。
※Windows環境では、MS-DOS時代からの伝統でカレントディレクトリにあるファイルは「パス名なし」で実行できるようになっています(Windows環境でも環境変数PATHが使用されています)。Linux環境でも、PATHに「.」を含めておくことで、カレントディレクトリにある実行可能ファイルのパス名が省略できるようになります。もちろん、非推奨です。
Copyright © ITmedia, Inc. All Rights Reserved.