wivern ロゴ

サイバーセキュリティ研究所

サイバーセキュリティを中心に、軍事、防犯、サーバーの管理と監視、その他、最新技術を研究しています。


Linux コマンド辞典「which」

which : コマンドを検索する

command: which

Linux にはファイル検索系のコマンドとして、which や find や locate などがありますが、それぞれに微妙に違いがあります。
今回は、その中から which コマンドの man の内容を翻訳して公開します。
which の特徴としては、環境変数 PATH にないディレクトリ検索しないという点です。


名前
which - (シェルの)コマンドをフルパスで表示する

書式
which [options] [--] programname [...]

説明
ひとつかそれ以上の引数を取ります。
それぞれの引数に対して、シェルプロンプトからの入力で実行を受け付けた実行可能ファイルをフルパスで標準出力に表示します。
これは、bash(1) と同じアルゴリズムを使って、環境変数 PATH に書かれたディレクトリにある実行可能ファイルかスクリプトを検索することで行っています。
この man のページは、which.texinfo ファイルから生成されました。

オプション
--all, -a
最初に見つかったものだけでなく、マッチングする全ての実行可能ファイルを表示します。

--read-alias, -i
標準入力からエイリアスを読み込んで、マッチするものを標準出力にレポートします。
これは which 自身にエイリアスを使うことと組み合わせると便利です。
例えば:
alias which='alias | which -i'

--skip-alias
「--read-alias」オプションがあれば無視します。
これは、which にエイリアスか機能として「--read-alias」オプションを使って通常のバイナリーファイルを明示的に検索するときに便利です。

--read-functions
標準入力からシェルの機能定義を読み込んで、マッチするものを標準出力にレポートします。
これは which 自身にシェルの機能を使うことと組み合わせると便利です。
例えば:
which() { declare -f | which --read-functions $@ }
export -f which

--skip-functions
「--read-functions」オプションがあれば無視します。
これは、which にエイリアスか機能として「--read-functions」オプションを使って通常のバイナリーファイルを明示的に検索するときに便利です。

--skip-dot
PATH に書かれたディレクトリの中で、「.」で始まるものをスキップします。

--skip-tilde
PATH に書かれたディレクトリの中で、「~」で始まるものと HOME ディレクトリをあるものをスキップします。

--show-dot
PATH にあるディレクトリの中で「.」で始まるパスで実行可能ファイルがマッチングした場合、フルパスではなくて「./programname」の形式で表示します。

--show-tilde
HOME ディレクトリで「~」で始まるディレクトリがマッチングした場合に表示します。
このオプションは、root で which が呼び出されたときは無視されます。

--tty-only
tty ではない場合にオプションの処理をただちに終了します。

--version,-v,-V
標準出力にバージョン情報を表示して、正常終了します。

--help
標準出力に使用方法を表示して、正常終了します。

返り値
失敗した引数の数か、プログラム名が与えられなかったときに「-1」を返します。

このユーティリティのオススメの使い方は、以下のように、( C シェルで)エイリアスか、( Bourne シェルで)シェルの機能を追加する方法です:

bash:

which ()
{
(alias; declare -f) | /usr/bin/which --tty-only --read-alias --read-functions --show-tilde --show-dot $@
}
export -f which

tcsh:

alias which 'alias | /usr/bin/which --tty-only --read-alias --show-dot --show-tilde'

これは、スクリプトから使われてフルパスで表示しているときでも、which をプロンプトから始めたときに読み取り可能な「~/」と「./」を表示します。

> which q2
~/bin/q2
> echo `which q2`
/home/carlo/bin/q2

バグ
HOME ディレクトリは、HOME 環境変数を探すことで決定されますので、この環境変数が存在しないときは強制終了します。
which は2つの等価なディレクトリを、一方がシンボリックリンクのあるパスを含む場合は別物と見なします。

作者
Carlo Wood ( carlo@gnu.org )

記述に際しては、細心の注意をしたつもりですが、間違いやご指摘がありましたら、こちらからお知らせいただけると幸いです。


←「Linux コマンド辞典「find」」
←「Linux コマンド辞典「uname」」


« 戻る