这是巴什。鱼的行为相似。
$ which python
/usr/bin/python
$ alias py=python
$ type py
py is aliased to `python'
然后,运行type -P py
什么也不打印,正如我所期望的那样以/usr/bin/pyton
类似于下面看到的方式打印。
$ type ls
ls is aliased to `ls --color=auto'
$ type -P ls
/bin/ls
该-P
选项的文档为
-P force a PATH search for each NAME, even if it is an alias,
builtin, or function, and returns the name of the disk file
that would be executed
我已经确认/usr/bin
(所在目录python
)在PATH
.
这里发生了什么?
这个:
并不意味着 bash 会扩展别名,然后搜索扩展的命令。这意味着,如果有一个 command
foo
和一个 aliasfoo
,即使有一个别名掩盖它,它type -P foo
仍然会查找名为的命令。foo
所以 bash 并没有扩展py
到type -P py
bepython
,也不会显示/usr/bin/python
。发生的事情是你的 shell 正在寻找一个
py
在你的每个目录中命名的二进制文件PATH
,但没有找到任何。type -P
不解释别名或函数;它强制在路径上搜索给定的名称,忽略任何其他可用命令,而不是具有相同名称的“文件”类型。type -p
( and有一个额外的微妙之处type -P
:它们考虑了散列,因此如果存在散列值,它们将显示一个散列值,而无需查看PATH
。但这里不涉及。)