2010-05-19 98 views
82

我知道,當你在shell上時,可以使用的唯一命令是可以在PATH上設置的某個目錄中找到的命令。 即使我不知道如何看到我的PATH變量上有哪些目錄(這是另一個可以回答的好問題),我想知道的是:外殼 - 如何找到一些命令的目錄?

我來找殼並寫下:

$ lshw 

我想知道一個shell命令,可以告訴我這個命令位於何處。換句話說,這個「可執行文件」位於何處?

喜歡的東西:

$ location lshw 
/usr/bin 

有人嗎?

回答

106

如果你使用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來做同樣的事情(你必須使用它作爲zsh,因爲type -a不會)。

+0

謝謝大家誰回答,但這個答案是最令人興奮的!謝謝!我在想我是瘋了,因爲我(很久以前)定義了一種方法來做到這一點:'更新',並且這已經做了'apt-get update; apt-get dist-upgrade'給我。但是現在,我試圖在某處找到一些update.sh文件,而我找不到它。這就是我開始這個問題的原因。但是現在,使用'type -a update'我發現這只是我的〜home中的.bashrc上定義的別名。真的很感謝你。 – 2010-05-20 13:36:50

+0

@ Gabriel:如果你不熟悉'locate',它可以幫助查找文件。它使用由'updatedb'維護的數據庫,該數據庫是從cron作業運行的。由於'locate'搜索數據庫而不是整個文件系統,它比'find'(可以作爲最後的手段)要快得多。 – 2010-05-20 14:10:10

+0

謝謝。我將學習這個工具,並且看看updatedb是如何計劃在Ubuntu的cronjob上運行的。 – 2010-05-20 15:58:26

42

像這樣:

which lshw 
+4

此外,它還可以查看所有在您的路徑中匹配的命令。 – AlG 2010-05-19 20:25:18

+0

我相信這隻適用於命令($ PATH可執行文件),而不是函數。 – 2015-12-08 23:36:37

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 
15

PATH是一個環境變量,並且可以通過echo命令被顯示:

echo $PATH 

這是通過冒號'分隔的路徑列表:'

which command t當你運行一個命令時,你會發現哪個文件被執行:

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 
0

Korn shell中,ksh,提供whence內置,標識等外殼內置插件,宏等which命令更便於攜帶,然而。

+1

在ksh中,'whence -a'類似於Bash的'type -a'。 – 2010-05-20 01:16:49