Linux which コマンド:コマンドの場所を特定する

LinuxBeginner
オンラインで実践に進む

はじめに

この実験では、which コマンドを使用して、シェルがコマンド名を実行する際に参照する実行ファイルの場所を特定する方法を学びます。インストールされているコマンドの確認、利用できないコマンドの扱い、複数の検索結果の表示、そして PATH 変数が結果に与える影響について理解を深めます。

which コマンドの動作をより深く理解するために、この実験では簡単なスクリプト、実行権限、一時的な PATH の変更といったシェルに関連する概念もいくつか使用します。それぞれの新しい概念はその都度解説しますので、なぜ which が特定のパスを返すのかという点に集中して学習を進めてください。

which コマンドの基本を理解する

TechCorpでの新しい役割に慣れてきたところで、チームリーダーから主要な開発ツールのインストール状況を確認するように指示されました。このタスクには which コマンドが最適です。

which コマンドは、PATH環境変数にリストされているディレクトリを検索し、指定されたコマンドに関連付けられた実行ファイルの場所を特定するために使用されます。

まずは gcc コンパイラの場所を特定してみましょう。

which gcc

以下のような出力が表示されるはずです。

/usr/bin/gcc

この出力は、gcc の実行ファイルが /usr/bin ディレクトリにあることを示しています。つまり、ターミナルで gcc と入力すると、システムは /usr/bin/gcc にあるファイルを実行するということです。

次に、もう一つの重要なツールである python の場所を特定してみましょう。

which python

以下のような結果が表示されるかもしれません。

/usr/local/bin/python

which コマンドは、PATH環境変数にリストされているディレクトリを順番に検索し、最初に見つかった一致を返します。もし異なるパスが表示されても心配しないでください。それは単に、お使いのシステムでPythonが別の場所にインストールされていることを意味するだけです。

存在しないコマンドの扱い

チームリーダーから、TechCorpでは以前 techbuild というカスタムビルドツールを使用していたという話がありました。現在もインストールされているか確認してみましょう。

which techbuild

出力が何も表示されない(Bashシェル)、あるいは techbuild not found のようなエラーメッセージが表示される(Zshシェル)かもしれません。

これは、PATH内にコマンドが見つからない場合、which が何も返さないためです。出力がないことに驚かないでください。これは、PATH内のどのディレクトリにも techbuild が見つからなかったことをコマンドが伝えているだけです。

この動作をより明確にするために、簡単なシェルスクリプトを使用してみましょう。ここでは2つの新しい概念を紹介します。

  1. シェルスクリプトとは、コマンドを順次実行するために保存されたテキストファイルのことです。
  2. cat <<'EOF' ... EOF というパターンを使うと、複数の引用符を管理することなく、複数行をファイルに書き込むことができます。

techbuild を確認するためのスクリプトを作成しましょう。

cat > ~/check_techbuild.sh <<'EOF'
#!/bin/bash
if which techbuild >/dev/null 2>&1; then
  echo "techbuild is installed"
else
  echo "techbuild is not installed"
fi
EOF

このコマンドは ~/check_techbuild.sh という名前のファイルを作成し、その中に小さなBashスクリプトを書き込みます。

重要な行の意味は以下の通りです。

  • #!/bin/bash は、このスクリプトをBashで実行するようにLinuxに指示します。
  • which techbuild は、コマンドが PATH 内に見つかるかどうかを確認します。
  • >/dev/null 2>&1 は、通常の出力とエラー出力を非表示にし、スクリプト独自の明確な結果メッセージのみを表示できるようにします。

次に、ファイルに実行権限を与えて実行します。

chmod +x ~/check_techbuild.sh

chmod +x コマンドは実行権限を追加し、Linuxがそのファイルをコマンドとして実行できるようにします。

~/check_techbuild.sh

which がコマンドを見つけられなかったため、このスクリプトは techbuild is not installed と表示します。

複数のインストール先を発見する

環境構築を進める中で、TechCorpではプロジェクトごとに複数のバージョンのPythonを使用していることに気づくかもしれません。which-a オプションを使うと、コマンドのすべてのインストール先を見つけることができます。

which -a python

以下のような出力が表示されるかもしれません。

/usr/local/bin/python
/usr/bin/python
/bin/python

この出力は、システム上に複数のPythonがインストールされていることを示しています。-a オプションは、最初に見つかったものだけでなく、PATH内で一致するすべての実行ファイルを表示するように which に指示します。

これを理解することは非常に重要です。なぜなら、PATHの設定に応じて、どのPython実行ファイルが実際に実行される可能性があるかをすべて把握できるからです。リストの最初に表示されたものが、ターミナルで python と入力した際に実行されるものです。

PATHの優先順位を理解する

チームリーダーによると、PATH変数内のディレクトリの順序によって、デフォルトで使用されるコマンドのバージョンが決まるとのことです。PATHを確認してみましょう。

echo $PATH

コロンで区切られたディレクトリのリストが表示されます。例:

/usr/local/sbin:/usr/local/bin:/usr/sbin:/usr/bin:/sbin:/bin

順序が重要です。先にリストされているディレクトリほど優先順位が高くなります。つまり、異なるディレクトリに同じ名前の実行ファイルが2つある場合、PATH内で先に出現するディレクトリにある方が使用されます。

この実験環境では、すでに ~/custom_bin にカスタムコマンド prioritydemo が作成されています。このディレクトリを PATH の先頭に追加して、システムディレクトリよりも先にチェックされるようにしましょう。

export PATH=$HOME/custom_bin:$PATH

次に、どの prioritydemo がデフォルトで実行されるかを確認します。

which prioritydemo

以下のような出力が表示されるはずです。

/home/labex/custom_bin/prioritydemo

PATH 内のすべての prioritydemo コマンドを確認するには、以下を実行します。

which -a prioritydemo

最初にカスタムコマンドが表示され、その後に /usr/local/bin にあるコピーが表示されるはずです。

/home/labex/custom_bin/prioritydemo
/usr/local/bin/prioritydemo

これはPATHの優先順位を明確に示しています。which prioritydemo は最初に見つかった実行ファイルを返し、which -a prioritydemo は現在の検索順序に従って一致するすべての実行ファイルを表示します。

カスタムコマンドを作成する

チームリーダーは、which がどのようにPATHとやり取りするかを示すために、簡単なカスタムコマンドを作成することを提案しています。ホームディレクトリに hello というスクリプトを作成してみましょう。

cat > ~/hello <<'EOF'
#!/bin/bash
echo "Hello from TechCorp!"
EOF
chmod +x ~/hello

これでホームディレクトリに hello という名前の新しいファイルが作成され、実行可能になりました。このスクリプトは実行されると Hello from TechCorp! と表示します。

それでは、実行してみましょう。

hello

ホームディレクトリがPATHに含まれていないため、「command not found(コマンドが見つかりません)」というエラーが表示されます。PATHは、シェルが実行ファイルを探すディレクトリのリストです。

一時的にホームディレクトリをPATHに追加してみましょう。

export PATH="$PATH:$HOME"

このコマンドは、現在のターミナルセッションの間、PATHの末尾にホームディレクトリを追加します。export コマンドにより、更新された PATH がその後に実行するコマンドでも利用可能になります。

これで hello を実行できるようになり、which もそれを見つけられるようになります。

hello
which hello

「Hello from TechCorp!」というメッセージと、スクリプトへのパスが表示されるはずです。これは、which がPATHにリストされているディレクトリ内であればどこでも実行ファイルを見つけられることを示しています。

まとめ

この実験では、which コマンドを使用してシステムのPATH内にある実行ファイルの場所を特定する方法を学びました。以下のことができるようになりました。

  1. インストールされているプログラムの場所を見つける
  2. 存在しないコマンドを扱う
  3. 同じコマンドの複数のインストール先を発見する
  4. PATHの優先順位を理解する
  5. カスタムコマンドを作成し、その場所を特定する

また、簡単なシェルスクリプトの作成、chmod +x を使用したファイルの実行可能化、そしてどのコマンドが実行されるかを制御するための PATH の調整についても練習しました。

これらのスキルは、TechCorpのデベロッパーとして、あるいはそれ以降のキャリアにおいても非常に貴重なものとなるでしょう。