2010-11-26 85 views
0

我遇到一个非常奇怪的问题,任何帮助表示赞赏。问题:无法在Unix中执行正确的可执行文件

我有一个可执行文件编译和cp到一个特定的位置。这个可执行文件的名称是“qact”在主函数的第一行有一个新增的cout语句。但是,当我在该目录中执行二进制文件时,我看不到它。过了很久,我意外地发现,如果我不在该目录中,当我执行它时,我可以看到输出的字符串。

后来我发现只有当我在那个目录中时,执行的二进制文件是错误的,我不会看到字符串。

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

真糊涂..

+0

可执行文件的名称是什么?假设它是a.out,pwd && ./a.out的输出是什么。 (./对于确保它不是PATH问题很重要) – 2010-11-26 03:59:51

+0

此可执行文件的名称是“qact” – Johnyy 2010-11-26 04:27:03

回答

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查找,但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来清空它。