8.4.40 whichコマンド(外部コマンドのパスを取得する)
形式
which[-a]コマンド名 ...
機能
環境変数PATHに設定されているコマンド検索パスから,実行する外部コマンドのコマンドパスを取得します。取得したコマンドパスは標準出力に出力します。
引数
- -a
環境変数PATHに設定されているコマンド検索パスの中から,実行できるすべてのコマンドパスを取得して出力します。
-aオプションを指定しない場合は,最初に取得されたコマンドパスだけを出力します。
- コマンド名
コマンドパスを取得したい外部コマンド名を指定します。複数指定できます。
指定した外部コマンドのコマンドパスが見つからなかった場合は,標準エラー出力に外部コマンドのコマンドパスが見つからなかったことを示すメッセージが出力されます。
コマンドパスの検索規則
外部コマンドのコマンドパスは次の規則で検索します。
- Windowsの場合
- 外部コマンドの検索対象パス
環境変数PATHに設定されているコマンド検索パスに対して,外部コマンドを検索します。環境変数PATHに複数のコマンドパスが設定されている場合は,先頭のコマンドパスから順番に検索します。なお,whichコマンドの実行者に外部コマンド格納ディレクトリの読み込み権限がない場合,そのディレクトリはコマンドパスの検索対象にはなりません。
- コマンドパスの出力対象となる外部コマンド
whichコマンドの実行者に外部コマンド格納ディレクトリの読み込み権限があればコマンドパスを出力します。外部コマンドの実行権限の有無は判断されません。
コマンドパスの出力対象となる外部コマンドは拡張子が「.com」,「.exe」,「.cmd」,「.bat」の実行ファイルです。
指定した外部コマンドに拡張子が含まれない場合,外部コマンド名に環境変数PATHEXTに定義されている順に拡張子を付けて外部コマンドを検索します。対象となる拡張子は「.com」,「.exe」,「.cmd」,「.bat」です。詳細については,「5.1.11 外部コマンドの指定」を参照してください。
- UNIXの場合
- 外部コマンドの検索対象パス
環境変数PATHに設定されているコマンド検索パスに対して外部コマンドを検索します。環境変数PATHに複数のコマンドパスが設定されている場合は,先頭のコマンドパスから順に検索します。なお,whichコマンドの実行者に外部コマンド格納ディレクトリ(パスを構成するすべてのディレクトリ)の検索権限がない場合,そのディレクトリはコマンドパスの検索対象にはなりません。
- コマンドパスの出力対象となる外部コマンド
whichコマンドの実行者に外部コマンドの実行権限があれば,実行できる外部コマンドと判断し,コマンドパスを出力します。外部コマンドの実行権限がない場合,その外部コマンドはコマンドパスの出力対象にはなりません。
引数に指定したコマンド名にパスが含まれている場合
- Windowsの場合
whichコマンドの実行者に外部コマンド格納ディレクトリの読み込み権限があればコマンドパス名を出力します。外部コマンドの実行権限の有無は判断されません。
外部コマンド格納ディレクトリの読み込み権限がない場合は外部コマンドのコマンドパスが見つからなかったことを示すメッセージを出力します。
コマンドパスの出力対象となる外部コマンドは拡張子が「.com」,「.exe」,「.cmd」,「.bat」の実行ファイルです。
指定した外部コマンドに拡張子が含まれない場合は,外部コマンド名に環境変数PATHEXTに定義されている順に拡張子を付けます。対象となる拡張子は「.com」,「.exe」,「.cmd」,「.bat」です。
指定した外部コマンドがシンボリックリンクの場合は,次のように動作します。
-
シンボリックリンクとリンク先ファイルの両方の拡張子が「.com」,「.exe」,「.cmd」,「.bat」であることで実行権限があると判断します。
-
シンボリックリンクに拡張子が含まれていない場合は,環境変数PATHEXTに定義されている順に拡張子を付けます。ただし,リンク先のファイルは拡張子の付加の対象外です。対象となる拡張子は「.com」,「.exe」,「.cmd」,「.bat」です。
-
- UNIXの場合
whichコマンドの実行者に外部コマンド格納ディレクトリ(パスを構成するすべてのディレクトリ)の検索権限と外部コマンドの実行権限がある場合,引数に指定したコマンド名を出力します。これらの権限がない場合は,外部コマンドのコマンドパスが見つからなかったことを示すメッセージを出力します。
終了コード
終了コード |
意味 |
---|---|
0 |
正常終了 |
1 |
エラー終了。 外部コマンドのコマンドパスが見つかりませんでした。または,複数の外部コマンドを検索した際,コマンドパスが見つからなかった外部コマンドがありました。 |
2 |
エラー終了。
|
注意事項
環境変数PATHが定義されていない場合はエラー終了します。
Windowsの場合,環境変数PATHEXTが定義されていない場合はエラー終了します。
次の名前を引数のコマンド名に指定した場合,外部コマンドとして検索します。
aliasコマンドで定義したエイリアス
予約語,シェル標準コマンド,シェル拡張コマンド,または関数
引数にパスが含まれているコマンド名を指定した場合,パス名が次の環境設定パラメーターによる変換対象のときは,変換後のパス名が出力されます。
PATH_CONVパラメーター
COMMAND_CONV_ARGパラメーター
Windowsの場合,コマンドパスの検索規則に該当する外部コマンドだけがコマンドパスの出力対象となります。
awk,find,およびxargsコマンドで外部コマンドを実行する場合は,その外部コマンドのパス検索規則は,次のように行われます。
外部コマンドの実行方法
パス検索規則
-
awkコマンドのsystem関数
-
awkコマンドの書式 コマンド名 | getline [変数名]
-
awkコマンドの書式 print [式[, ... ]] | コマンド名
コマンドプロンプトなどのコマンドプロセッサ実行のパス検索規則に従う
-
findコマンドの-execプライマリ
-
findコマンドの-okプライマリ
-
xargsコマンド
プログラム実行を行うWindows APIのパス検索規則に従う
このため,上記のコマンドに指定したコマンド名を引数に指定したときに出力されるコマンドパスと,実行されるコマンドのパスが異なる場合があります。
-
使用例
コマンド名pgm01.exeのコマンドパスを取得します。
C:\TEMP>%ADSH_OSCMD_DIR%\which pgm01.exe C:\Program Files\Hitachi\PP001\pgm01.exe
コマンド名pgm01のコマンドパスを取得します。コマンド名には拡張子を指定していません。
C:\TEMP>%ADSH_OSCMD_DIR%\which pgm01 C:\Program Files\Hitachi\PP001\pgm01.exe
-aオプションを指定して,コマンド名pgm01.exeのすべてのコマンドパスを取得します。
C:\TEMP>%ADSH_OSCMD_DIR%\which -a pgm01.exe C:\Program Files\Hitachi\PP001\pgm01.exe C:\Program Files\Hitachi\PP002\pgm01.exe C:\Program Files\Hitachi\PP003\pgm01.exe
コマンド名pgm02のコマンドパスを取得します。なお,コマンド検索パスにpgm02は存在しません。
C:\TEMP>%ADSH_OSCMD_DIR%\which pgm02 which: no pgm02 in (C:\WINDOWS\system32;C:\WINDOWS;C:\Program Files\Hitachi\PP001 ;C:\Program Files\Hitachi\PP002;C:\Program Files\Hitachi\PP003)
コマンド名pgm01,pgm02,pgm03,pgm04のコマンドパスを取得します。なお,コマンド検索パスにコマンド名pgm02,pgm04は存在しません。
C:\TEMP>%ADSH_OSCMD_DIR%\which pgm01 pgm02 pgm03 pgm04 C:\Program Files\Hitachi\PP001\pgm01.exe which: no pgm02 in (C:\WINDOWS\system32;C:\WINDOWS;C:\Program Files\Hitachi\PP001 ;C:\Program Files\Hitachi\PP002;C:\Program Files\Hitachi\PP003) C:\Program Files\Hitachi\PP001\pgm03.exe which: no pgm04 in (C:\WINDOWS\system32;C:\WINDOWS;C:\Program Files\Hitachi\PP001 ;C:\Program Files\Hitachi\PP002;C:\Program Files\Hitachi\PP003)
パスを含むコマンド名を指定して実行します。指定したプログラム名は存在します。
C:\TEMP>%ADSH_OSCMD_DIR%\which "C:\Program Files\Hitachi\PP001\pgm01" C:\Program Files\Hitachi\PP001\pgm01.exe
パスを含むコマンド名を指定して実行します。指定したコマンド名は存在しません。
C:\TEMP>%ADSH_OSCMD_DIR%\which "C:\Program Files\Hitachi\PP001\pgm02" which: no pgm02 in (C:\Program Files\Hitachi\PP001)