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シェル)かもしれません。

これは、whichがPATH内でコマンドを見つけられない場合、何も返さないためです。出力がないことに驚かないでください。これは、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:Linuxに対して、このスクリプトをBashで実行するように指示します。
  • 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にカスタムのlsコマンドが作成されています。このディレクトリをPATHの先頭に追加して、システムディレクトリよりも先にチェックされるようにしましょう。

export PATH=$HOME/custom_bin:$PATH

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

which ls

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

/home/labex/custom_bin/ls

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

which -a ls

カスタムコマンドが最初に表示され、その後にシステム版が続くはずです。

/home/labex/custom_bin/ls
/usr/bin/ls
/bin/ls

これはPATHの優先順位を明確に示しています。which lsは最初に見つかった実行ファイルを返し、which -a lsは検索結果の全リストを表示します。

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

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

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

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

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

hello

「command not found」エラーが発生します。これは、ホームディレクトリがPATHに含まれていないためです。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での開発者としてのキャリア、そしてその先においても非常に貴重なものとなるでしょう。