PATH
シェルスクリプトを使用して、特定のプログラムのパスを見つける必要があります。パスは次のいずれかに後で渡すことができるプログラムの実際の完全なパスでなければなりませんexec*
検索しない機能、PATH
例えば、自分自身をexecv
。
のようなプログラムがあります。これらのプログラムkill
は、実際のプログラムとシェル組み込みとして同時に利用できます。この場合、実際のプログラムへの完全なパスが必要です。
セクション2.9.1.1、POSIX標準のコマンド検索と実行でPATH
指定されているようにプログラムを見つけることができるユーティリティがいくつかあります。
がありwhich
、これは標準の一部ではありません。一部のシステムでは通常のプログラムである場合がありますが、一部のシェルでは組み込みです。ほとんどのシステムとシェルで使用できるようですが、組み込みバージョンのシェルも、実行可能ファイルへのパスではなく、組み込みの名前を返すだけです。また、いかなる方法でも標準化されておらず、出力を返したり、異なるオプションを使用したりする場合があります。
bash# which kill
/usr/bin/kill
dash# which kill
/usr/bin/kill
fish# which kill
/usr/bin/kill
mksh# which kill
/usr/bin/kill
tcsh# which kill
kill: shell built-in command.
zsh# which kill
kill: shell built-in command
あるwhence
いくつかのシェルのビルトインされています、。ただし、多くのシェルでは使用できません。プログラムへのパスではなく、組み込みの名前も返します。A -p
をwhenceに渡して、この動作を変更できます。
bash# whence kill
bash: whence: command not found
dash# whence kill
dash: 1: whence: not found
fish# whence kill
fish: Unknown command 'whence'
mksh# whence kill
kill
mksh# whence -p kill
/usr/bin/kill
tcsh# whence kill
whence: Command not found.
zsh# whence kill
kill
zsh# whence -p kill
/usr/bin/kill
command
POSIX:2008で指定されているビルトインがあります。残念ながら、通常のコマンドとビルトインも検索し、同じ名前のビルトインによってシャドウされているプログラムへのパスの代わりにビルトインの名前を返します。いくつかの古いシェルはまだ実装していません。
bash# command -v kill
kill
dash# command -v kill
kill
fish# command -v kill
/usr/bin/kill
mksh# command -v kill
kill
tcsh# command -v kill
command: Command not found.
zsh# command -v kill
kill
realpath
enable
のみで提供されるbash
とzsh
type -p
。bashとdashの両方command
を使用すると、同じ名前の関数または組み込み関数がある場合でも、実際の実行可能ファイルを実行するコマンドを言うことができます。
command
は、関数(およびエイリアス)をスキップしますが、Qが正しく述べているように、ビルトインはスキップしません。また、すべてのシステムに特定のシェルまたはPOSIXシェルを取得するパスがないため、常にシバンを使用できるわけではありません。
enable
がPOSIXで指定されているかどうかはわかりませんが、指定されている場合はenable -n which
、のシェルビルトインを無効にするために使用できますwhich
。