     [file version.texi not included]

     This file documents `which' version 2.x.

     Copyright © 2000 - 2015, by

     Carlo Wood, Run on IRC <carlo@alinoe.com>
     RSA-1024 0x624ACAD5 1997-01-26                    Sign & Encrypt
     Fingerprint16 = 32 EC A7 B6 AC DB 65 A6  F6 F6 55 DD 1C DC FF 61

     Japanese Translation Copyright © 2023 Linux JM project

     Permission is granted to make and distribute verbatim copies of
     this manual provided the copyright notice and this permission notice
     are preserved on all copies.

Permission is granted to copy and distribute modified versions of this manual under the conditions for verbatim copying, provided also that the section entitled ``GNU General Public License'' is included exactly as in the original, and provided that the entire resulting derived work is distributed under the terms of a permission notice identical to this one.

Permission is granted to copy and distribute translations of this manual into another language, under the above conditions for modified versions, except that the section entitled ``GNU General Public License'' may be included in a translation approved by the author instead of in the original English.

Note (by the translator): Actually, ``GNU General Public License'' is not included in the original version of this info manual. You will get a copy of it at <https://www.gnu.org/licenses/>.

which: コマンドのフルパスを表示する
*********************

which プログラムは、(シェル) コマンドのフルパスを表示する。

このファイルは、which version VERSION (UPDATED に更新) について解説している。

【読者への御注意】これは、GNU 版の which コマンドのマニュアルである。 which の実装には、いくつかの系統があるので、お手元の which が別系統であるときは、オプションなどがここで説明しているものとかなり違うかもしれない。そのときは、お手元の which に付属するマニュアルをご覧になっていただきたい。

which プログラムについて
***************

Which は、ひとつ以上の引数を取り、そうした引数のそれぞれについて、それがシェルのプロンプトから入力されていたら、実行されていたであろう実行ファイルのフルパスを標準出力に表示する。Which は、それを行うに当たり、bash(1) と同じアルゴリズムを使って、環境変数 PATH にリストされたディレクトリを調べ、実行ファイルやスクリプトを捜す。

which の起動
*********

which 起動の書式は、次のとおりである。

     which [options] [--] programname [...]

オプション一覧
*******

--all
-a
     PATH 中で最初に引数に一致したものだけでなく、一致したすべての実行ファイルを表示する。

--read-alias
-i
     標準入力からエイリアスを読み込んで、引数に一致するものを標準出力に書き出す。このオプションは、which コマンドの代わりにエイリアスを使用する場合に、その中で使うとよい。たとえば、次のようにだ。

     alias which='alias | which -i'

--skip-alias
     --read-alias オプションが指定されていても、それを無視する。このオプションは、which の代わりに使うエイリアスや関数で --read-alias オプションを使用している場合に、通常のバイナリを明示的に探すのに役に立つ。

--read-functions
     標準入力からシェル関数の定義を読み込んで、引数に一致するものを標準出力に書き出す。このオプションは、which コマンドの代わりにシェル関数を使用する場合に、その中で使うとよい。たとえば、次のようにだ。
      which () { declare -f |
     /usr/bin/which --read-functions $@; }
     export -f which

--skip-functions
     --read-functions が指定されていても、それを無視する。このオプションは、which の代わりに使うエイリアスや関数で --read-functions オプションを使用している場合に、通常のバイナリを明示的に捜すのに役に立つ。

--skip-dot
     環境変数 PATH 中のドット (.) で始まるパスをスキップする。 (環境変数 PATH に '.' や './bin'、'.local' などが登録されている場合のことを言っている。'$HOME/.local' といったディレクトリのことではない。そのへんの事情は、--show-dot でも同じである。)

--skip-tilde
     PATH 中のチルダ (~) で始まるディレクトリと、HOME ディレクトリ以下にある実行ファイルをスキップする。

--show-dot
     PATH 中にドット (.) で始まるパスがあるとき、それに対応するディレクトリで引数に一致する実行ファイルが見つかったら、フルパスではなく "./programname" などと表示する。

--show-tilde
     ディレクトリに HOME ディレクトリが含まれているときは、チルダを出力する。このオプションは、which が root の権限で実行されている場合には無視される。

--tty-only
     出力が端末でない場合は、これより右にあるオプションの処理をしない。 (このオプションに効果があるのは、--show-dot, --show-tilde, --skip-dot, --skip-tilde に対してだけのようである。)

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

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

返り値
***

Which は、検索に失敗した引数の個数を返す。引数に programname が指定されなかった場合には、-1 を返す。

用例
**

このユーティリティの使用に当たっては、以下のように、エイリアスや (C shell の場合) シェル関数に (Bourne shell の場合)、which コマンドの代わりに使用するものを追加しておくことをおすすめする。

[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 をプロンプトから実行したときには、パスを ~/ や　./ という読みやすい形で表示するが、スクリプトから使用した場合には、通常どおりフルパスの表示になる。 (実際には、こうした関数やエイリアスを端末のプロンプトから実行しようと、スクリプトから実行しようと、表示に変わりはない。出力先が、標準出力や標準エラーか、それ以外かで違いが生じるようである (実行例の二番目では、標準入力に出力している)。念のため、ご自分でお試しいただきたい。)

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

バグ
**

HOME ディレクトリの特定は、環境変数 HOME を調べることで行われるが、この変数が存在しない場合は、HOME ディレクトリの特定作業は打ち切られる。 (この記述は古いようだ。パッケージ同梱の NEWS ファイルによれば、which-2.19 以来、環境変数 HOME が設定されていない場合は、/etc/passwd ファイルが調べられ、そこでも指定されていない場合は、'/' がホームディレクトリになるとのことである。) また、Which は、二つのディレクトリが事実上同じものであっても、片方のパスにシンボリックリンクが含まれている場合は、別のディレクトリと見なすことになる。

関連項目
****

bash(1)