问题:无法在Unix中执行正确的可执行文件

时间:2010-11-26 03:46:52

标签: unix

我遇到了一个非常奇怪的问题,感谢任何帮助。

我有一个可执行文件已编译并且cp到特定位置。这个可执行文件的名称是“qact”在main函数的第一行有一个新添加的cout语句。但是当我在该目录中执行二进制文件时,我看不到它。很长一段时间后,我不小心发现如果我不在那个目录中,我可以在执行时看到输出的字符串。

后来我发现只有当我在该目录中时,执行的二进制文件才会出错,我才会看到字符串。

当我在那个可执行文件上使用哪个时,不管我在哪个目录中,我总是得到相同的结果,这是正确的位置。

真的很困惑..

1 个答案:

答案 0 :(得分:2)

您在$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每次都会进行完整的grep查找,但是bash会保留一个哈希表,bash仍然认为命令/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

您可以使用type builtin来诊断此问题。 $ type grep grep is hashed (/usr/bin/grep) 将告诉您命令是内置shell,别名,函数,关键字还是可执行文件。如果是后者,它会告诉您可执行文件的完整路径:

hash

那你怎么解决这个问题呢?您可以使用help hash内置来操作哈希表(类型grep以获取更多信息)。如果您只想修复一个条目(在这种情况下为hash -d grep),您可以grep说“删除grep的哈希表条目”,在这种情况下下次你执行$PATH,它会按预期搜索完整的$PATH。如果您要清除整个哈希表(例如,如果您刚安装了大量新软件或更改了hash -r),请使用{{1}}清空它。