“没有这样的文件或目录”但它确实存在。

182

我只想从命令行运行一个可执行文件,./arm-mingw32ce-g++,但是我遇到了以下错误消息:

bash: ./arm-mingw32ce-g++: No such file or directory

我正在运行 Ubuntu Linux 10.10。 ls -l 列出文件。

-rwxr-xr-x 1 root root  433308 2010-10-16 21:32 arm-mingw32ce-g++

使用sudo (sudo ./arm-mingw32ce-g++)的效果是

sudo: unable to execute ./arm-mingw32ce-g++: No such file or directory

我不知道为什么操作系统看不到已经存在的文件。有什么想法吗?

22个回答

123

这个错误可能意味着./arm-mingw32ce-g++不存在(但实际上是存在的),或者它存在并且是内核识别的动态链接可执行文件,但其动态加载程序不可用。您可以通过运行ldd /arm-mingw32ce-g++来查看需要什么动态加载程序。任何标记为not found的内容都是您需要安装的动态加载程序或库。

如果您正在尝试在amd64安装上运行32位二进制文件:


21
太棒了,运行成功了!顺便提一下,在我安装ia32-libs之前,ldd的输出是“不是动态可执行文件”。 - Warpspace
6
在Ubuntu 16.04中,ia32-libs-*已被弃用,请安装lib32ncurses5lib32z1替代。 - GaloisPlusPlus
3
当尝试运行第三方二进制文件时,在Nix或NixOS上出现的常见问题;请参阅patchelf。 - bbarker
2
@GaloisPlusPlus帮了我。谢谢。我不得不安装lib32z1 - nantitv
1
@mako https://unix.stackexchange.com/questions/13391/getting-not-found-message-when-running-a-32-bit-binary-on-a-64-bit-system/13409#13409 - Gilles 'SO- stop being evil'
显示剩余9条评论

53

我在Ubuntu上尝试构建Selenium源代码时遇到了这个错误。 即使我已经满足了所有的先决条件,带有正确shebang的简单shell脚本仍然无法运行。

file file-name # helped me in understanding that CRLF ending were present in the file.

我在Vim中打开了这个文件,发现由于我曾经在Windows机器上编辑过这个文件,所以它是DOS格式的。我使用下面的命令将其转换为Unix格式:

:set ff=unix
:wq
dos2unix filename # actually helped me and things were fine.

我希望我们在跨平台编辑文件时,也要注意文件格式。


成功了!尝试了多种方法,这就是解决方案。谢谢! - Pedro Perez
1
虽然晚了十年,但功劳归功。在我的情况下,我使用WSL2在Windows上运行,并将Windows目录挂载到WSL中运行的发行版中。Windows换行符-Unix文件。 - Brenton Thomas
谢谢,@BrentonThomas。我很高兴它有帮助。我还没有在Windows上尝试过WSL。我希望能尽快使用它。 - Jitendra
谢谢,这实际上是我的错误。我在Windows上构建了一个Docker镜像,并将一个具有错误行结尾的shell脚本复制到了镜像中。 - Michael Chen

35

如果尝试运行脚本并且错拼了shebang,也会导致此错误。请确保它读取#!/bin/sh#!/bin/bash或您使用的任何解释器。


5
我指的是可执行文件,而不是脚本。但另外有人可能会发现这个评论很有用。 - Warpspace
1
没错,但我因为这个确切的问题而来到了这个问题,所以就像你说的,也许其他人也会遇到同样的问题。 - Zoltán
1
在我的情况下,我试图运行 ./my/full/path/myscript 而不是 ./myscript - Noumenon

12
我试图运行一个Python脚本时也遇到了同样的错误信息--这不是@Warpspace的预期用例(请参见其他评论),但这是我搜索结果中排名靠前的几个,所以也许有人会觉得有用。
在我的情况下,问题出在DOS换行符导致的(\r\n而不是\n),这会使得shebang行(#!/usr/bin/env python)失效。使用简单命令dos2unix myfile.py即可解决该问题。

我在Symfony项目中运行./bin/console时遇到了同样的问题。 - tanaydin

12

我在这里找到了解决我的Ubuntu 18问题的方法

sudo dpkg --add-architecture i386

那么:

sudo apt-get update
sudo apt-get install libc6:i386 libncurses5:i386 libstdc++6:i386

1
这在我的情况下是答案。谢谢! - Toma

7

正如其他人所提到的,这是因为找不到加载器,而不是您的可执行文件。不幸的是,该消息并不清楚。

您可以通过更改可执行文件使用的加载器来解决此问题,请参阅我在另一个问题中的详细答案:单个主机上多个glibc库

基本上,您需要找出它正在尝试使用哪个加载器:

$ readelf -l arm-mingw32ce-g++ | grep interpreter
  [Requesting program interpreter: /lib/ld-linux.so.2]

然后找到等效加载程序的正确路径,并将可执行文件更改为使用实际路径中的加载程序:

$ ./patchelf --set-interpreter /path/to/newglibc/ld-linux.so.2 arm-mingw32ce-g++

您可能需要设置包含文件的路径,如果您尝试运行它后还不确定是否需要,请查看另一个线程中的所有详细信息。


在我的情况下,除了令人困惑的错误消息之外,“ldd”还错误地报告找到了加载器:“/lib/ld-linux-x86-64.so.2 => /lib64/ld-linux-x86-64.so.2”,但实际上并不是这样。这可以通过使用“ln”而不是“patchelf”来修复:“sudo ln /lib64/ld-linux-x86-64.so.2 /lib/ld-linux-x86-64.so.2”。 - stasoid
如果您没有root访问权限,或者只需要修复一个二进制文件,那么patchelf是一个不错的选择。但如果您有多个存在此问题的二进制文件,并且需要创建系统范围的链接,则可能系统不一致,最好重新考虑策略...进行一些恢复或重新安装操作。 - msb

5

我遇到了这个错误"没有这个文件或目录",但实际上它是存在的。这是因为我的文件是在Windows中创建的,而我尝试在Ubuntu上运行它,该文件包含无效的15\r,每当有一个新行时都会出现这种情况。我只需创建一个新文件,截断不需要的内容即可。

sleep: invalid time interval ‘15\r’
Try 'sleep --help' for more information.
script.sh: 5: script.sh: /opt/ag/cont: not found
script.sh: 6: script.sh: /opt/ag/cont: not found
root@Ubuntu14:/home/abc12/Desktop# vi script.sh 
root@Ubuntu14:/home/abc12/Desktop# od -c script.sh 
0000000   #   !   /   u   s   r   /   b   i   n   /   e   n   v       b
0000020   a   s   h  \r  \n   w   g   e   t       h   t   t   p   :   /

0000400   :   4   1   2   0   /  \r  \n
0000410
root@Ubuntu14:/home/abc12/Desktop# tr -d \\015 < script.sh > script.sh.fixed
root@Ubuntu14:/home/abc12/Desktop# od -c script.sh.fixed 
0000000   #   !   /   u   s   r   /   b   i   n   /   e   n   v       b
0000020   a   s   h  \n   w   g   e   t       h   t   t   p   :   /   /

0000400   /  \n
0000402
root@Ubuntu14:/home/abc12/Desktop# sh -x script.sh.fixed 

5
我在尝试运行一个简单的bash脚本时遇到了相同的错误,该脚本不会有32/64位问题。这可能是因为您尝试运行的脚本中存在错误。这篇Ubuntu论坛帖子指出,在普通脚本文件中,您可以在前面添加sh,并且您可能会从中获得一些调试输出。例如:
$ sudo sh arm-mingw32ce-g++

运行命令并查看是否有任何输出。

在我的情况下,实际问题是我要执行的文件是Windows格式而不是Linux格式。


3
为了方便用户参考,这里添加一些内容: 当在Windows上工作并尝试在Linux中运行此脚本时(由于不同的换行符分隔符,Windows会引入额外字符),就会出现此错误。错误信息有误导性。
在Windows中,换行符是CRLF(\r\n),而在Linux中是LF(\n)。通常可以在文本编辑器中选择。
在我的情况下,这是由于在Windows上工作并上传到Unix服务器执行引起的。

1
我使用Docker和Linux,但是在Windows上构建它。我的脚本开始于scriptdir=$(cd "$( dirname "${BASH_SOURCE[0]}" )" && pwd),然后cd $scriptdir || exit 1,但是在我用Windows编辑的文件中\r被附加到了scriptdir值上。因此,消息: no such file or directory非常令人困惑,因为它最终抹掉了它所抱怨的内容。 - Jesse Chisholm

2

以下命令在16.4的Ubuntu上工作:

当您的.sh文件损坏或格式不符合Unix协议时,就会出现此问题。

dos2unix可以将.sh文件转换为Unix格式!

sudo apt-get install dos2unix -y
dos2unix test.sh
sudo chmod u+x test.sh 
sudo ./test.sh

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接