シェルを使用している場合、使用できるコマンドは、PATHに設定されたディレクトリで見つかるコマンドのみであることを知っています。私のPATH変数にdirsがどのように表示されるかわかりません(これは答えられる別の良い質問です)、私が知りたいのは:
私はシェルに来て、書いています:
$ lshw
このコマンドがどこにあるかを教えてくれるシェルのコマンドを知りたい。つまり、この「実行可能ファイル」はどこにあるのでしょうか?
何かのようなもの:
$ location lshw
/usr/bin
誰でも?
Bashまたはzshを使用している場合、これを使用します。
type -a lshw
これにより、ターゲットが組み込み、関数、エイリアス、または外部実行可能ファイルかどうかが示されます。後者の場合、PATH
に表示される各場所が表示されます。
bash$ type -a lshw
lshw is /usr/bin/lshw
bash$ type -a ls
ls is aliased to `ls --color=auto'
ls is /bin/ls
bash$ zsh
zsh% type -a which
which is a Shell builtin
which is /usr/bin/which
Bashでは、関数のtype -a
も関数定義を表示します。 declare -f functionname
を使用して同じことを行うことができます(type -a
は使用しないため、zshに使用する必要があります)。
このような:
which lshw
パスで一致するすべてのコマンドを表示するには:
which -a lshw
PATH
は環境変数であり、echoコマンドで表示できます。
echo $PATH
これは、コロン文字「:
」で区切られたパスのリストです
which
コマンドは、コマンドを実行したときに実行されるファイルを示します。
which lshw
時々、取得するのはシンボリックリンクへのパスです。実際の実行可能ファイルが存在する場所へのリンクをトレースする場合は、readlink
を使用して、それにwhich
の出力を渡すことができます。
readlink -f $(which lshw)
-f
パラメーターは、readlink
に、シンボリックリンクを再帰的にたどり続けるよう指示します。
これが私のマシンの例です:
$ which firefox
/usr/bin/firefox
$ readlink -f $(which firefox)
/usr/lib/firefox-3.6.3/firefox.sh
~$ echo $PATH
/home/jack/bin:/usr/local/sbin:/usr/local/bin:/usr/sbin:/usr/bin:/sbin:/bin:/usr/games
~$ whereis lshw
lshw: /usr/bin/lshw /usr/share/man/man1/lshw.1.gz
TENEX Cシェルtcshでは、コマンドの場所をリストできます。組み込みコマンドの場合は、where
コマンドを使用して、たとえば:
tcsh% where python
/usr/local/bin/python
/usr/bin/python
tcsh% where cd
cd is a Shell built-in
/usr/bin/cd
Kornシェルksh
は、whence
ビルトインを提供します。これは、他のシェルビルトイン、マクロなどを識別します。ただし、which
コマンドはより移植性があります。