你在你的$PATH
同名的另一个可执行文件在其他地方?如果是这样,bash可能会执行错误的可执行文件,因为它使用散列表来避免额外的$PATH
查找(请参阅Command Search and Execution)。
例如,假设您的$PATH
为/opt/local/bin:/usr/bin
,并且您只有grep
安装在/usr/bin
中。当您执行grep
,你会得到明显的结果:
$ echo $PATH
/opt/local/bin:/usr/bin
$ which grep
/usr/bin/grep
$ grep --version
grep (GNU grep) 2.5.1
现在假设你安装的grep
一个新版本进入/opt/local/bin
,这是较早在$PATH
比/usr/bin
。由于which
总是每次都做满$PATH
查找,但Bash保留一个哈希表,庆典仍然认为该命令grep
映射到一个在/usr/bin
:
$ which grep
/opt/local/bin/grep
$ grep --version
grep (GNU grep) 2.5.1
$ /opt/local/bin/grep --version
GNU grep 2.6.3
可以使用type
builtin诊断这个问题。 type
会告诉你一个命令是否是shell内建的,别名,函数,关键字或可执行文件。如果后者告诉你可执行文件的完整路径:
$ type grep
grep is hashed (/usr/bin/grep)
那么你如何解决这个问题呢?您可以使用内建的hash
来操作散列表(请输入help hash
了解更多信息)。如果您只想修复一个条目(在这种情况下为grep
),则可以执行hash -d grep
来说“删除grep
的哈希表条目”,在这种情况下,下次执行grep
时,它将按预期搜索完整的$PATH
。如果你想清除整个散列表(例如,如果你刚刚安装了大量的新软件,或者你改变了你的$PATH
),那么使用hash -r
来清空它。
可执行文件的名称是什么?假设它是a.out,pwd && ./a.out的输出是什么。 (./对于确保它不是PATH问题很重要) – 2010-11-26 03:59:51
此可执行文件的名称是“qact” – Johnyy 2010-11-26 04:27:03