如何找到一些命令的目录?

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

我来是想写:

$ lshw

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

比如:

$ location lshw
/usr/bin
156922 次浏览

像这样:

which lshw

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

which -a lshw
~$ 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

Abc0是一个环境变量,可以用 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

Korn shell,ksh,提供了 whence内置功能,它可以识别其他 shell 内置功能、宏等。但是,which命令更具可移植性。

如果您正在使用 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不这样做)。

在 TENEX C Shell ()中,可以使用 where命令列出命令的位置,或者如果它是内置命令,则可以使用如下命令:

tcsh% where python
/usr/local/bin/python
/usr/bin/python


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

type -a的一个替代品是 command -V

因为大多数时候我只对第一个结果感兴趣,我也从头管。这样,在使用 bash 函数的情况下,屏幕不会充斥大量代码。

command -V lshw | head -n1

TLDR 答案

用途: whereis -b lshw

解释

使用 whereis命令

whereis-定位命令的二进制文件、源文件和手册页文件

常用开关

此外,您还可以指定要查找的内容:

  • whereis -b packagename: 二进制文件位置的源。
  • whereis -m packagename: 手册位置的来源。
  • whereis -s packagename: 源代码位置的源代码。

在您的例子中,由于您正在寻找二进制文件,所以您需要: whereis -b lshw

还有其他使用这个命令的开关,请在 手册。中检查它们。如果没有与包名相关联的文件,您将看到一个空行。

例子

下面是一些现实生活中的用法:

holdoffhunger@tower:~$ whereis grep
grep: /bin/grep /usr/share/man/man1/grep.1.gz /usr/share/man/man1/grep.1posix.gz


holdoffhunger@tower:~$ whereis -m grep
grep: /usr/share/man/man1/grep.1.gz /usr/share/man/man1/grep.1posix.gz


holdoffhunger@tower:~$ whereis -s grep
grep:

中(在我的例子中,当前版本是5.9) ,您可以使用 =作为前缀检查某个命令的目录。 例如,如果想知道 mkdir命令的位置,可以使用:

$> ls -l =mkdir
-rwxr-xr-x 1 root root 76216 Jun 14 20:49 /usr/bin/mkdir

或者更简单一点:

$> echo =mkdir
/usr/bin/mkdir

注意: 此方法仅适用于当前 shell 中根据 $PATH环境变量可用的命令。因此,如果 $PATH的值为 “/home/user/bin:/usr/bin:/usr/local/bin”,那么只有这3个路径下的命令可用。