No.017シェル
which
ウィッチ・コマンドパス探索
PATH上から実行ファイルの場所を探して表示します。手軽ですが、移植性やシェル解決全体の確認ではcommand -vやtypeのほうが適することがあります。
答えよく使う形
$ which ls
/usr/bin/ls
$ which -a python3
$ which grep
練習用の部屋です。何を打っても本物は変わりません。本物の Linux で続ける →
どんなコマンド?
外部コマンドの実体パスを手早く知りたい時、複数のPATH候補があるか確認したい時に使います。
whichは、指定したコマンド名に対して、PATHに従って見つかる実行ファイルの場所を表示するための確認用コマンドです。インストール済みプログラムの場所を手早く知りたい時に便利です。
ただし、whichはPOSIX標準ではありません。実装差があり、環境によっては未導入、別挙動、shell script実装など差が出ます。また、aliasや関数、シェル組み込みまで含めた現在のシェル解決順を正確に知りたい場合には不向きです。
実務では、外部コマンドの実体パスをざっと確認する用途にとどめ、移植性重視のスクリプトではcommand -v、Bash対話確認ではtypeを優先するのが安全です。
書き方とオプション
組み立ててみるオプションを押すと、下の1行に足されます。もう一度押すと外れます。
$ which
使用例と実行結果
行を押すとコピーできます。
/usr/bin/ls
まず安全に試す
3分ミッション
手を動かすと覚えやすくなります。できたものに印を付けてください(この端末に残ります)。
0 / 1
つまずいたとき
whichでは見つからないのにコマンドは実行できる
原因現在のシェルでaliasや関数として定義されている可能性があります。
こうするtypeやcommand -vで確認します。
環境によってwhich -aが使えない
原因whichは標準仕様ではなく、実装差があります。
こうする移植性が必要ならcommand -vを基本にします。
終わったときの数(戻り値)
$ echo $?
- 0少なくとも1件見つかりました。
- 1見つかりませんでした。
- >1実装依存のエラーが起きました。
気をつけることと入れ方
危険度は低いですが、whichの結果だけでaliasや関数が無いと判断すると誤認につながります。診断用途ではtypeやcommand -vと使い分けてください。
環境による違い
whichはPOSIX標準ではありません。実装差があり、利用可否、オプション、aliasや関数の扱いが環境で異なります。移植性重視ならcommand -vを優先します。
確かめた環境Debian GNU/Linux / 13 / Bash 5.2.372026-04-09 に確認
よくある質問
whichはスクリプトで使ってもよいですか。
単純用途なら動くこともありますが、移植性や正確さを重視するならcommand -vのほうが無難です。
whichとtypeはどう違いますか。
whichは外部コマンドの場所確認寄りで、typeは現在のシェル解決全体の確認に向きます。
which を最後まで読みました。
Linux コマンド辞典に戻る139 / 144