没有相应的文件和目录?但是文件存在!


186

我已经下载了一个游戏(Shank),但是bin文件没有运行。当我尝试启动可执行文件时显示的错误是:

bash: ./shank-linux-120720110-1-bin: No such file or directory

2
也许先“ chmod u + x ./shank*bin”?
agent86 2012年

也应该不是被” .BIN',而不是‘-bin’,也许它只是一个错字
Anake

谢谢您的回复。我已经完成了您所说的Agent86的命令,但结果相同。我也下载了.deb文件,但是也有问题。我不知道这个游戏有什么问题。
弗朗切斯科

请确认您是否正在运行64位安装(此问题最常见的情况)。
吉尔斯

是的,我确认我在笔记本电脑上使用的是64位体系结构。
弗朗切斯科

Answers:


235

您可能正在尝试在未安装32位支持的64位系统上运行32位二进制文​​件。

在三种情况下,您会收到消息“没有这样的文件或目录”:

  • 该文件不存在。我想您已经检查了该文件是否确实存在(可能是因为Shell完成了该文件)。
  • 有一个名字相同的文件,但这是一个悬挂的符号链接。
  • 该文件存在,您甚至可以读取它(例如,该命令file shank-linux-120720110-1-bin显示“ ELF 32位LSB可执行文件……”之类的内容),但是当您尝试执行该文件时,系统会告知您该文件不存在。

在最后一种情况下,错误消息令人困惑。这是在告诉您,缺少运行该程序所需的运行时环境的关键组件。不幸的是,报告错误的通道只为错误代码留有空间,而对于这些额外的信息则没有余地,这实际上归咎于运行时环境。如果要使用此说明的技术版本,请在64位系统上运行32位二进制文​​件时阅读“ 获取未找到”消息

file命令将告诉您该二进制文件是什么。除少数例外,您只能针对您的Ubuntu版本所针对的处理器体系结构运行二进制文件。主要的例外是,您可以在64位(amd64,又名x86_64)系统上运行32位(x86,又名IA32)二进制文件。

在11.04以下的Ubuntu中,要在64位安装上运行32位二进制文​​件,您需要安装ia32-libspackage 安装ia32-libs。您可能需要安装其他库(如果这样做,将会得到明确的错误消息)。

自11.10(oneiric)引入了多体系结构支持以来,您仍然可以安装ia32-libs,但是您可以选择一种更细粒度的方法,足以获取(加上任何其他必要的库)。libc6-i386 安装libc6-i386


吉尔斯,非常感谢您的答复。虽然我还没有遇到这个问题(但!),但我已将您的答案存档,以备将来参考。
Jim C

感谢您详尽的回答!我下载的文件箱是该格式中唯一可用的文件(箱)。因此,我认为对所有体系结构都有好处。我还为我的体系结构(64位)下载了.deb文件,但错误有所不同。在这一点上,我认为游戏受到某些错误的影响,或者我无法安装该游戏。现在,我尝试下载libc6-i386,但仍尝试安装它。如果有重大更改,我将再次写信。谢谢您的时间。
弗朗切斯科

2
@Francesco请发布解决方案!它可能会帮助其他试图在Ubuntu上运行Shank的人。回答您自己的问题完全可以
吉尔斯

1
您可以ldd用来检查是否缺少图书馆。ldd kgio_ext.so可能会说其他类似libruby.so.2.3 => not found的话
EnabrenTane

1
显然还有另外一种情况bash: ...some...path...: No such file or directory可以出现:移动可执行文件后。Bash似乎在$ PATH中缓存了可执行文件的路径。运行hash -r清除它。参见:unix.stackexchange.com/a/5610/11352
akavel

53

64位Ubuntu Multiarch系统

仅在file file-nameshows 的输出显示时,才遵循此答案,

file-name: ELF 32-bit LSB  executable, Intel 80386, version 1 (SYSV), dynamically linked (uses shared libs), for GNU/Linux 2.6.8, not stripped

要运行在64位多拱Ubuntu系统的32位可执行文件,你必须添加i386的建筑,你也必须安装libc6:i386libncurses5:i386libstdc++6:i386这三个库软件包。

sudo dpkg --add-architecture i386
sudo apt-get update
sudo apt-get install libc6:i386 libncurses5:i386 libstdc++6:i386
./file-name

我会在最后一个命令中使用sudo:因为sudo启动32位二进制文​​件(显然不是您或Ubuntu编译),所以可能会有风险。(当然,即使是非root用户也一样)
alci

最后可能会是什么,但它可以工作。
Avinash Raj 2014年

1
需要注意的是,如果您使用的是CentOS或RedHat,则此答案不适用。因此被甩了几个小时。
忽略了

1
在Kali 2 64位上,我只需要安装libselinux1:i386
Aralox

4

通过安装32位的deb,我意识到我缺少了一些库(除了ia32-libs和libc6)。我首先通过给出以下命令解决了这个问题:

sudo apt-get install -f          

然后我又遇到了一个错误:

Message: SDL_GL_LoadLibrary 
Error: Failed loading libGL.so.1

显然,这些库已正确安装。在不赘述的情况下,我不得不手工链接库。我意识到那可以通过Synaptic安装以下软件包来实现更简单的解决方案:

libgl1-mesa-glx:i386
libgl1-mesa-dri: i386.

之后,下一个问题是播放时出现黑屏,我通过使用以下代码替换/ Shank / bin中的可执行文件来解决该问题:http : //treefort.icculus.org/smb/smb-linux-mesa-hotfix-test.tar .bz2

我希望这对某人有用。如果您需要更多帮助或更多详细信息,请随时与我联系。


3

这是一个抄本,显示了更多有关问题的性质以及如何从Ubuntu 16.04开始修复该问题的记录。请注意,即使file报告“动态链接”,也ldd报告“不是动态可执行文件”。

$ ./myprogram
bash: myprogram: No such file or directory

$ file myprogram
myprogram: ELF 32-bit LSB executable, Intel 80386, version 1 (SYSV), dynamically linked, interpreter /lib/ld-linux.so.2, for GNU/Linux 2.2.5, not stripped

$ ldd myprogram
    not a dynamic executable

安装libc6:i386后,情况开始有所改善...

$ sudo apt-get install libc6:i386 # the initial fix
...

$ ldd myprogram
    linux-gate.so.1 =>  (0xf77fd000)
    libc.so.6 => /lib/i386-linux-gnu/libc.so.6 (0xf7626000)
    /lib/ld-linux.so.2 (0x56578000)

$ ./myprogram
myprogram: error while loading shared libraries: libstdc++.so.6: cannot open shared object file: No such file or directory

为了完成这项工作,您可能需要一次识别并安装一个额外的库...

$ sudo apt-get install libstdc++6:i386 ## may require various additional libs

$ ./myprogram
... works correctly ...

我不知道是否有系统的方法来识别要安装的正确库。将错误消息映射到程序包名称有些猜测(选项卡完成有助于)。


ldd(错误地)报告“不是动态可执行文件”。
nobar

3

要扩展@Gilles答案,至少有三种情况会导致此错误:

  1. 该文件不存在。
  2. 该文件存在,但是是一个悬空的符号链接。
  3. 该文件存在(例如file命令起作用),从而产生令人费解的错误消息。这可能意味着加载程序存在问题。

装载机问题类别:

  1. 可执行文件的加载程序不存在。您可以使用file命令检查此内容,并查看加载程序是否存在。例如

    file lmgrd
    lmgrd: ELF 64-bit LSB executable, x86-64, version 1 (SYSV), dynamically linked, interpreter /lib64/ld-lsb-x86-64.so.3, for GNU/Linux 2.6.18, stripped
    

    公告interpreter /lib64/ld-lsb-x86-64.so.3; 如果此文件不存在,则需要安装它。对于16.04上的此特定加载程序,答案是sudo apt-get install lsb

  2. 脚本的加载程序存在问题(请参阅此答案)。

  3. 缺少共享库-用于ldd <file-name>检查任何“未找到”库。有关更多信息,请参见此答案

加载程序不存在可能是由于32/64位不匹配或某些其他原因。我可能不知道其他类型的装载程序错误。


1
就我而言,file lmutil没有显示解释器,但是显示了ldd,安装lsb解决了问题。
davidA
By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.