我知道当你在shell中时,唯一可以使用的命令是可以在PATH设置的某个目录中找到的命令。
即使我不知道如何查看我的PATH变量中有哪些目录(这是另一个很好的问题可以回答),但我想知道的是:
我进入shell并写入:
$ lshw
我想知道在shell中有哪个命令可以告诉我这个命令的位置。换句话说,这个“可执行文件”在哪里?
类似于:
$ location lshw
/usr/bin
我知道当你在shell中时,唯一可以使用的命令是可以在PATH设置的某个目录中找到的命令。
即使我不知道如何查看我的PATH变量中有哪些目录(这是另一个很好的问题可以回答),但我想知道的是:
我进入shell并写入:
$ lshw
我想知道在shell中有哪个命令可以告诉我这个命令的位置。换句话说,这个“可执行文件”在哪里?
类似于:
$ location lshw
/usr/bin
如果您正在使用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
不会显示函数定义)。
像这样:
which lshw
要查看与您的路径匹配的所有命令:
which -a lshw
type
。 - tripleeetype -a lshw
。 - Marinos AnPATH
是一个环境变量,可以使用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
which ack
返回 ack: aliased to ...
,因此无法在脚本中工作。 - Hi-Angel~$ 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
-b
选项,然后可以将其与 awk
结合使用以获取路径。因此,类似这样:whereis -b ack | awk '{print $2}'
- Hi-Angelwhere
命令列出命令的位置或者是否为内置命令,例如:tcsh% where python
/usr/local/bin/python
/usr/bin/python
tcsh% where cd
cd is a shell built-in
/usr/bin/cd
tcsh
是很受欢迎的,但那是在开源 Bourne 兼容 shell 变得广泛可用之前。 - tripleee一个替代 type -a
的方法是 command -V
由于大多数情况下我只对第一个结果感兴趣,所以我也会使用 head 命令。这样,在 bash 函数的情况下,屏幕不会被代码淹没。
command -V lshw | head -n1
command -V
吗?我看到了 command -v
的使用,但不知道它们之间有什么不同。 - VimNing-V
更加详细,它会打印出 lshw is /usr/bin/lshw
,而 -v
只会打印 /usr/bin/lshw
。 - Marinos Ancommand
本身的文档? - VimNingcommand --help
吗? - Marinos Anman zshbuiltins
。然后向下滚动一点,你就会找到 command
内置命令的文档。 - Marinos An使用命令: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:
whereis
不是标准命令。最好使用 POSIX 规定的 type
和 command
。 - tripleeeKorn shell(ksh
)提供了内置命令whence
,可以识别其他shell内置命令、宏等。然而,which
命令更具可移植性。
=
来检查某个命令所在的目录。
例如,如果你想知道mkdir
命令所在的位置,你可以使用以下命令:$> ls -l =mkdir
-rwxr-xr-x 1 root root 76216 Jun 14 20:49 /usr/bin/mkdir
$> echo =mkdir
/usr/bin/mkdir
注意:此方法仅适用于根据您的$PATH
环境变量在当前 shell 中可用的命令。因此,如果您的$PATH
的值为"/home/user/bin:/usr/bin:/usr/local/bin",则只有这三个路径下的命令将可用。
locate
命令,它可以帮助你查找文件。它使用由updatedb
维护的数据库,该数据库是从cron作业运行的。由于locate
搜索的是数据库而不是整个文件系统,因此比find
快得多(后者只能作为最后一招)。 - Dennis Williamsontype -a
输出函数定义以及可执行文件类型。使用head
的风险在于,在名称具有多个类型的情况下,其他类型不会被输出。您可能需要查看type -t
。 - Dennis Williamsontype -p
。 - Dennis Williamson