回答:
エイリアスのみ、シェル関数、他のビルトインなどを完全に知ることができるのはビルトインのみであるため、シェルビルトインのみが与えられたコマンド名に対してシェルが何をするかを正しく伝えます。要確認:すべてのコマンドがそもそも実行可能ファイルに対応しているわけではありません。
Bourne Againシェルの場合bash
、組み込みtype
コマンドは次のとおりです。
$ type '['
[ is a shell builtin
Fishシェルの場合fish
、type
組み込みはbashと同様に機能します。実行可能ファイルへのパスのみを取得するには、次を使用しますcommand -v
。
$ type cat
cat is /bin/cat
$ command -v cat
/bin/cat
Kornシェルの場合ksh
、ビルトインはwhence
コマンドです。type
最初はの通常のエイリアスとして設定されwhence -v
、command
ビルトインは次の-v
オプションと同等whence
です:
$ whence -v ls
ls is a tracked alias for /bin/ls
Zシェルの場合、zsh
、内蔵しているwhence
と、コマンドcommand
と内蔵-v
のオプションと等価whence
とビルトインtype
、which
およびwhere
に相当するwhence
オプションで-v
、-c
および-ca
それぞれ。
$ whence ls
/bin/ls
TCシェルの場合tcsh
、組み込みwhich
コマンドはコマンドです。その名前の外部コマンドと混同しないでください。
> which ls
ls: aliased to ls-F
> which \ls
/bin/ls
type
zshにも組み込まれていますか?
which-2.19-6.el6.x86_64
は、スタートアップファイルをに置きます/etc/profile.d/which2.sh
。これは、zshを含む非cshシェルによって読み取られます。それwhich
はそれ自身にエイリアスします。したがって、特にzshユーザーの場合は、組み込みのbreaksをオーバーライドしますwhich
。
which
これに使用できます:
aix@aix:~$ which ls
/bin/ls
PATH
引数の名前に一致する実行可能ファイルを検索することで機能します。はシェルエイリアスでは機能しないことに注意してください。
aix@aix:~$ alias listdir=/bin/ls
aix@aix:~$ listdir /
bin dev initrd.img lib32 media proc selinux tmp vmlinuz
...
aix@aix:~$ which listdir
aix@aix:~$
type
ただし、機能します:
aix@aix:~$ type listdir
listdir is aliased to `/bin/ls'
which
必ずしもそれだけでは十分ではありません。$ PATH ...で最初に見つかった名前のみを返します。その名前はシンボリックリンクであり、実際のチェーン終了実行可能ファイルではありません。
which
(必ずしも)実行可能ファイルを返しません。$ PATHで最初に一致するファイル名(またはを使用する場合は複数の類似ファイルwhich -a
)を返します... 実際の実行可能ファイルは、複数のリンクから離れている場合があります。
which locate
/usr/bin/locate
file $(which locate)
/usr/bin/locate: symbolic link to /etc/alternatives/locate'
実際の実行可能ファイルを見つけるコマンドはreadlink -e
、
(と組み合わせてwhich
)
readlink -e $(which locate)
/usr/bin/mlocate
すべての中間リンクを表示するには:
f="$(which locate)" # find name in $PATH
printf "# %s\n" "$f"
while f="$(readlink "$f")" ;do # follow links to executable
printf "# %s\n" "$f"
done
# /usr/bin/locate
# /etc/alternatives/locate
# /usr/bin/mlocate