WHICH(1)

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

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

説明
which は 1 つまたは複数の引数を取ります。 その引数それぞれに対して、その引数がシェルプロンプトから入力された際に、実行されることになる実行モジュールのフルパスを stdout に出力します。 これを実現する際には、環境変数 PATH に列記されたディレクトリ内から実行ファイルやスクリプトを検索します。 これは bash(1) と同じアルゴリズムを用いています。 このマニュアルページは which.texinfo ファイルから生成されています。

オプション

--all, -a
    PATH 内に見つかった実行ファイルすべてを表示します。 最初に見つかったもの以外も表示します。

--read-alias, -i
    標準入力からエイリアスを読み込んで、合致したものを標準出力します。 これは which そのものを含む alias において、本オプションを合わせて利用すると便利です。 たとえば以下です。
    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 ユーザーが実行した際には無視されます。

--tty-only
    tty 上でない場合、この右側に指定されたオプションの実行を停止します。

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

--help
    利用方法を標準出力して正常終了します。

返り値
which は検索に失敗した引数の数を返します。 また `programname' が指定されなかった場合は -1 を返します。

例
このユーティリティーのお薦めの使い方は、 which に対するエイリアス (C シェル) やシェル関数 (Bourne シェル) を追加して利用する方法です。 たとえば以下です。 [ba]sh の場合:
which ()
{
  (alias; declare -f) | /usr/bin/which --tty-only --read-alias --read-functions --show-tilde --show-dot $@
}
export -f which
[t]csh の場合:
alias which 'alias | /usr/bin/which --tty-only --read-alias --show-dot --show-tilde'
こうすることで、プロンプトから実行した場合には、見やすいように ~/ や ./ を出力します。 スクリプトから利用した場合には、そのままフルパスで出力します。
> which q2
~/bin/q2
> echo `which q2`
/home/carlo/bin/q2

バグ
HOME ディレクトリは、環境変数 HOME を調べることで決定されますが、この変数が存在しない場合には、その処理がキャンセルされます。which は 2 つの同等のディレクトリであっても、その 1 つにシンボリックリンクを使ったパスが含まれている場合に、別のディレクトリと取り扱ってしまいます。

著者
Carlo Wood <carlo@gnu.org>

関連項目
bash(1)