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

问题:无法在Unix中执行正确的可执行文件,unix,Unix,我遇到了一个非常奇怪的问题,非常感谢您的帮助 我编译了一个可执行文件,并将其保存到特定位置。这个可执行文件的名称是“qact”,在主函数的第一行有一个新添加的cout语句。但是当我在那个目录中执行二进制文件时,我看不到它。很长一段时间后,我意外地发现,如果我不在该目录中,我可以在执行时看到输出的字符串 后来我发现只有当我在那个目录中时,执行的二进制文件是错误的,我看不到字符串 当我在那个可执行文件上使用which时,无论我在哪个目录中,我总是得到相同的结果,并且它是正确的位置 真的很困惑。您的$

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

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

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

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


真的很困惑。

您的
$PATH
中是否还有另一个同名的可执行文件?如果是这样,bash可能执行了错误的可执行文件,因为它使用哈希表来避免额外的
$PATH
查找(请参阅)

例如,假设您的
$PATH
/opt/local/bin:/usr/bin
,并且您只在
/usr/bin
中安装了
grep
。当您执行
grep
时,您会得到明显的结果:

$ echo $PATH
/opt/local/bin:/usr/bin
$ which grep
/usr/bin/grep
$ grep --version
grep (GNU grep) 2.5.1
现在假设您在
/opt/local/bin
中安装了较新版本的
grep
,该版本在
$PATH
中早于
/usr/bin
。因为
它每次总是执行完整的
$PATH
查找,但是bash保留了一个哈希表,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
您可以使用来诊断此问题<代码>类型
将告诉您命令是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的输出是多少。(./确保这不是路径问题很重要)此可执行文件的名称为“qact”,谢谢您提供的信息。当我尝试“哈希”时,它说哈希表是空的。当我“键入”它时,它会显示正确的位置。是的,此可执行文件还有许多其他版本。我只是试了点别的。PATH=”“,因此不存在其他路径。它仍然在对我做同样的事情。我只是知道,在我将命令输入shell之后,shell会记住该命令并将其放入散列。但这条路是对的,我试过了。1.新鲜环境设置2。在/apps/qfactor/server/bin-->外部运行qact-->结果良好,哈希现在有一个条目3。在/apps/qfactor/server/bin-->内部运行qact-->结果不正确,哈希仍有该项。