关于linux:Shell – 如何查找某些命令的目录?

Shell - How to find directory of some command?

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

我来到壳牌公司,写下:

1
$ lshw

我想知道shell上的一个命令,它可以告诉我这个命令在哪里。换句话说,这个"可执行文件"在哪里?

类似:

1
2
$ location lshw
/usr/bin

有人吗?


如果您使用的是bash或zsh,请使用:

1
type -a lshw

这将显示目标是内置的、函数、别名还是外部可执行文件。如果是后者,它将显示在您的PATH中出现的每个位置。

1
2
3
4
5
6
7
8
9
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不需要)。


这样地:

1
which lshw


PATH是一个环境变量,可以用echo命令显示:

1
echo $PATH

它是由冒号字符"EDOCX1"〔1〕分隔的路径列表。

which命令告诉您在运行命令时执行哪个文件:

1
which lshw

有时,您得到的是指向symlink的路径;如果您希望跟踪该链接到实际可执行文件所在的位置,则可以使用readlink并向其提供which的输出:

1
readlink -f $(which lshw)

-f参数指示readlink递归地跟踪符号链接。

下面是我的机器的一个例子:

1
2
3
4
5
$ which firefox
/usr/bin/firefox

$ readlink -f $(which firefox)
/usr/lib/firefox-3.6.3/firefox.sh

1
2
3
4
~$ 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 shell(tcsh)中,可以列出命令的位置,或者如果命令是内置命令,则可以使用where命令,例如:

1
2
3
4
5
6
7
tcsh% where python
/usr/local/bin/python
/usr/bin/python

tcsh% where cd
cd is a shell built-in
/usr/bin/cd

korn shell,ksh提供了whence内置,它标识了其他shell内置、宏等。然而,which命令更易于移植。