bash声称可执行文件在尝试执行时不存在,但确实存在

时间:2019-06-25 13:08:53

标签: bash

我无法解释的最奇怪的经历,是我把头发拔出来。我有一个二进制可执行文件MMM,它存在,我可以看到它具有x权限设置,当我按TAB键并且文件确认其可执行文件时,bash甚至会自动完成名称,但这会发生:

~/tmp$ ls -l
total 56
-rwxrwxr-x 1 polyphemus polyphemus 56948 Jun 25 22:43 MMM
~/tmp$ file MMM
MMM: ELF 32-bit LSB executable, Intel 80386, version 1 (SYSV), dynamically linked, interpreter /lib/ld-, for GNU/Linux 2.2.5, stripped
~/tmp$ ./MMM
-bash: ./MMM: No such file or directory

因此,我从另一台服务器复制了此文件,并确保没有发生奇怪的文件损坏,不是那可以解释bash的荒谬说法,即该文件不存在,我将该文件复制到了NAS上,从NAS回到另一台服务器并重复完全相同的实验,只有这种情况才会发生:

~/tmp$ ls -l
total 56
-rwxr-xr-x 1 bernd bernd 56948 Jun 25 22:53 MMM
~/tmp$ file MMM 
MMM: ELF 32-bit LSB executable, Intel 80386, version 1 (SYSV), dynamically linked, interpreter /lib/ld-, for GNU/Linux 2.2.5, stripped
~/tmp$ ./MMM
JAVA_HOME is not set. ./MMM cannot start.

如果这两个Linux Mint盒都可以帮助它们,那么可以使用的是一台使用Mint 19的开发机器,而不能使用的一台则是全新安装的Mint 19.1。

安装正常,其他可执行文件也可以正常运行,然后我可以使用./file在bash中运行。

我研究并比较了购物者,没有发现任何别名,也没有发现任何别名。这使我拔头发。我希望有人见过。

3 个答案:

答案 0 :(得分:0)

它可能是无法加载的库(因为它在您的系统上不存在),并带有错误消息。试试:

ldd .MMM

这将为您提供尝试加载的动态库,并告诉您是否缺少该库。

答案 1 :(得分:0)

错误似乎是JAVA_HOME env变量

JAVA_HOME is not set. ./MMM cannot start.

只需从您使用的任何Java版本设置JAVA_HOME

您可以像这样内联运行

JAVA_HOME=$(readlink -f /usr/bin/javac | sed "s:/bin/javac::") ./MMM

答案 2 :(得分:0)

感谢丹尼斯·威廉姆森(Dennis Williamson)提供的问题的指针,其特征如下:

  1. 这是一个众所周知的问题。因为存在内核限制,这意味着当内核尝试加载运行二进制文件所需的文件时,bash仅接收状态代码(“未找到文件”的状态代码)而没有任何描述性数据。该消息确实令人沮丧地令人误解,这是一个广为人知和理解的问题。
  2. 正如问题本身所指出的那样,这是一个ELF二进制文件:https://en.wikipedia.org/wiki/Executable_and_Linkable_Format,可以用产生readelf -a MMM | grep interpreter的{​​{1}}来划分此类二进制信息所需的解释器
  3. 很容易看到此文件在我的系统上丢失了,事实证明,要安装该文件,我们只需安装带有[Requesting program interpreter: /lib/ld-linux.so.2]的32位体系结构的lib6库即可。

完成此操作后,使我感到困惑的问题场景现在看起来像工作场景:

sudo apt install libc6:i386

二进制文件运行得很好!

令人愉快的结果。非常感谢StackOverflow和Dennis Williamson。