我遇到了一个非常奇怪的问题,感谢任何帮助。
我有一个可执行文件已编译并且cp到特定位置。这个可执行文件的名称是“qact”在main函数的第一行有一个新添加的cout语句。但是当我在该目录中执行二进制文件时,我看不到它。很长一段时间后,我不小心发现如果我不在那个目录中,我可以在执行时看到输出的字符串。
后来我发现只有当我在该目录中时,执行的二进制文件才会出错,我才会看到字符串。
当我在那个可执行文件上使用哪个时,不管我在哪个目录中,我总是得到相同的结果,这是正确的位置。
真的很困惑..
答案 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}}清空它。