シェル-コマンドのディレクトリを見つける方法は?


127

シェルを使用しているときに使用できるコマンドは、PATHで設定されたディレクトリにあるコマンドだけであることを知っています。私がPATH変数にあるdirsを確認する方法がわからない場合でも(これは回答できる別の良い質問です)、知りたいのは次のとおりです。

私はシェルに来て書く:

$ lshw

このコマンドがある場所を教えてくれるシェルのコマンドを知りたい。つまり、この「実行可能ファイル」はどこにあるのでしょうか。

何かのようなもの:

$ location lshw
/usr/bin

誰でも?

回答:


187

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では、for関数type -aは関数定義も表示します。あなたdeclare -f functionnameは同じことをするために使うことができます(そうtype -aしないのであなたはそれをzshのために使わなければなりません)。


答えてくれた皆さんに感謝しますが、この答えが一番エキサイティングでした!ありがとうございました!私はこれを行う方法を(ずっと前に)定義したので、私は狂っていると思っていました。apt-get dist-upgrade 'を使用してください。しかし、今のところ、どこかでupdate.shファイルを見つけようとしていましたが、見つかりませんでした。それが私がこの質問を始めた理由です。しかし、今、 'type -a update'を使用して、これが〜homeにある.bashrcで定義されたエイリアスであることがわかりました。本当にありがとうございました。
ガブリエルL.オリベイラ

1
@Gabriel:慣れていない場合はlocate、ファイルの検索に役立ちます。これは、updatedbcronジョブから実行されるデータベースによって維持されます。locateファイルシステム全体ではなくデータベースを検索するため、より高速ですfind(最後の手段として使用できます)。
追って通知があるまで一時停止。

ありがとうございました。このツールを調べて、updatedbがUbuntuのcronjobで実行されるようにスケジュールされている方法を確認します。
ガブリエルL.オリベイラ

時々type -a混乱することがあります。たとえば、nvmどちらがbash関数であるtype -a nvm | head -n1かを知る必要がありnvmます。
Marinos An

@MarinosAn:関数のtype -a場合、関数定義と実行可能ファイルのタイプを出力します。使用のリスクheadは、複数のタイプの名前の場合、追加のタイプが出力されないことです。あなたは見てみたいかもしれませんtype -t
追って通知があるまで一時停止。

64

このような:

which lshw

パスで一致するすべてのコマンドを表示するには:

which -a lshw 

7
また、パスに一致するすべてのコマンドを表示する-a lshw
AlGは

これは関数ではなくコマンド($ PATH上の実行可能ファイル)でのみ機能すると思います。
Olivier Lacan

which複数の実装があり、それらの多くは完全に間違ったことを行い、他の実装は正常に機能しているように見えますが、奇妙な驚きがあります。type代わりに好むはずです。
tripleee

エイリアスとbash関数には機能しません。少なくともubuntuでは。使いtype -a lshw
Marinos An

17

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

5
~$ 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

3

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

0

Kornシェルはkshwhence他のシェルの組み込み、マクロなどを識別する組み込みを提供しますwhich。ただし、コマンドはより移植性があります。


1
kshでは、whence -aBashに似ていtype -aます。
追って通知があるまで一時停止。

0

の代替type -acommand -V

ほとんどの場合、最初の結果のみに関心があるので、頭からパイプします。この方法では、bash関数の場合に画面がコードで溢れることはありません。

command -V lshw | head -n1
弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.