Shell-如何查找某些命令的目录?


127

我知道当您在shell上时,只能使用在PATH上某个目录中可以找到的命令。即使我也不知道如何查看PATH变量上的目录(这是另一个可以回答的好问题),我想知道的是:

我来壳写:

$ lshw

我想知道shell上的命令,该命令可以告诉我该命令位于何处。换句话说,此“可执行文件”位于何处?

就像是:

$ location lshw
/usr/bin

任何人?

Answers:


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中,对于函数,type -a还将显示函数定义。您可以declare -f functionname用来做相同的事情(您必须对zsh使用它,因为type -a没有这样做)。


感谢回答的每个人,但是这个答案是最令人兴奋的!谢谢!我当时以为自己疯了,因为(很久以前)我定义了一种方法来执行此操作:“更新”,并且一直在执行“ apt-get update; apt-get dist-upgrade”。但是现在,我试图在某个地方找到一些update.sh文件,但找不到。这就是为什么我开始这个问题。但是现在,使用“ type -a update”,我发现这只是在〜home上的.bashrc上定义的别名。真的谢谢你。
加布里埃尔·奥利维拉 Gabriel L. Oliveira)2010年

1
@Gabriel:如果您不熟悉locate它可以帮助查找文件。它使用由updatedbcron作业运行的数据库来维护。由于locate搜索数据库而不是整个文件系统,因此它比find(可以用作最后手段)要快得多。
暂停,直到另行通知。

谢谢。我将研究该工具,并查看如何将updateb计划在Ubuntu的cronjob上运行。
加布里埃尔·奥利维拉

有时type -a可能会造成混乱。例如,如果nvm是bash函数,我需要做:type -a nvm | head -n1找出确切的含义nvm
马里诺斯(Marinos)

@MarinosAn:对于函数,type -a输出函数定义以及可执行文件的类型。使用的风险head在于,如果名称具有多个类型,则不会输出其他类型。您可能要看看type -t
暂停,直到另行通知。

64

像这样:

which lshw

要查看路径中所有匹配的命令:

which -a lshw 

7
也可以使用-a lshw查看与您的路径匹配的所有命令。
AlG 2010年

我相信这仅适用于命令($ PATH上的可执行文件),而不适用于函数。
奥利维尔·拉坎

which这是有问题的,因为有多个实现,其中许多实现完全是错误的事情,而其他实现似乎还不错,但是却有些奇怪。您应该选择type代替。
人间

对别名和bash函数不起作用。至少在ubuntu上。更好地利用type -a lshw
马里诺的

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 Shell 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 shell ksh提供了whence内置功能,该功能可以标识其他Shell内置功能,宏等。which但是,该命令更便于移植。


1
在ksh中,whence -a类似于Bash的type -a
暂停,直到另行通知。

0

的替代品type -acommand -V

因为大多数时候我只对第一个结果感兴趣,所以我也从头开始。这样,在执行bash功能的情况下,屏幕不会充满代码。

command -V lshw | head -n1
By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.