这是巴什。鱼类的行为类似。
$ 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
.
这里发生了什么?
答案1
这:
强制对每个名称进行路径搜索,即使它是别名,
并不意味着 bash 将扩展别名然后搜索扩展的命令。这意味着,如果有一个 commandfoo
和一个 alias foo
,type -P foo
则仍然会查找名为的命令foo
,即使有一个别名掩盖了它。所以 bash 不会扩展py
为type -P py
be python
,也不会显示/usr/bin/python
。
答案2
发生的情况是,您的 shell 正在查找py
上每个目录中指定的二进制文件PATH
,但没有找到任何文件。
type -P
不解释别名或函数;它强制在路径上搜索给定名称,忽略任何其他不属于“文件”类型且具有相同名称的可用命令。
type -p
( and有一个额外的微妙之处type -P
:它们考虑了哈希值,因此如果存在哈希值,它们将显示哈希值,而不需要查看PATH
。但这不在这里涉及。)