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

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

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

I'm running Ubuntu Linux 10.10. ls -l lists

-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

I have no idea why the OS can't even see the file when it's there. Any thoughts?

613215 次浏览

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

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

对于一个不会有32/64位问题的简单 bash 脚本,我得到了同样的错误。这可能是因为您试图运行的脚本中有一个错误。这个 Ubuntu 论坛帖子表明,对于普通的脚本文件,您可以在前面添加 sh,并且您可能从中获得一些调试输出。例如:。

$ sudo sh arm-mingw32ce-g++

看看有没有结果。

在我的例子中,实际的问题是我试图执行的文件是 Windows 格式的,而不是 Linux 格式的。

如果尝试运行脚本而 开始吧拼写错误,也可能发生此错误。确保它读取 #!/bin/sh#!/bin/bash或者你正在使用的任何解释器。

我在 Mac 上创建的一个文件也有同样的问题。 如果我尝试用./filename 在 shell 中运行它,就会得到文件 not found 错误消息。 我觉得文件有问题。

我所做的:

向服务器打开 ssh 会话
Cat 文件名
将输出复制到剪贴板
Rm 文件名
触摸文件名
Vi 文件名
I 代表插入模式
粘贴剪贴板上的内容
ESC 到端插入模式
: WQ! < br >

这招对我很管用。

当我试图运行 Python 脚本的时候,我得到了同样的错误消息——这不是@Warpspace 想要的用例(参见其他评论) ,但是这是我搜索中最热门的一个,所以也许有人会发现它很有用。

在我的例子中,Shebang 线(#!/usr/bin/env python)会绊倒的是 DOS 线的结尾(\r\n而不是 \n)。一个简单的 dos2unix myfile.py就修好了。

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

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

我在 Vim 中打开了这个文件,我可以看到,仅仅因为我曾经在 Windows 机器上编辑过这个文件,它就是 DOS 格式的。我用以下命令将文件转换为 Unix 格式:

dos2unix filename # actually helped me and things were fine.

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

我得到了这个错误 “No such file or directory”,但它的存在,因为我的文件是在 Windows 中创建的,我试图在 Ubuntu 上运行它,文件包含无效的15r,只要有一个新的行。 我刚创建了一个新文件,删除不需要的东西

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

我在 mingw32 bash有个问题。我从 Program Files (x86)\nodejs执行 node/npm,然后将它们移动到 disabled目录(实际上是从 path 中删除它们)。我也有 Program Files\nodejs(即。64位版本) ,但仅在 x86版本之后。重新启动 bash shell 后,可以找到64位版本的 npm。node始终正常工作(与移动 x86版本时更改的 node -v一起检查)。

我认为 bash -r会工作,而不是重新启动 bash: https://unix.stackexchange.com/a/5610

下面的命令可以在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

正如其他人所提到的,这是因为无法找到加载程序,而不是您的可执行文件。不幸的是,信息不够明确。

您可以通过更改您的可执行文件使用的加载程序来修复它,请参阅我对另一个问题的全面回答: 单个主机上的多个 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++

您可能还需要设置 include 的路径,在尝试运行它之后,您将知道是否需要它。看看另一个帖子里的所有细节。

我有这个问题,原因是 EOL 在一些编辑器,如记事本 + + 。您可以在编辑菜单/EOL 转换中检查它。应选择 Unix (LF)。 我希望它能派上用场。

此处添加以供将来参考(针对可能陷入相同情况的用户) : 当在 Windows 上工作时(由于与 Linux 系统不同的行分隔符而引入了额外的字符)并试图在 Linux 中运行这个脚本(插入了额外的字符)时,会发生这个错误。错误消息具有误导性。

在 Windows 中,行分隔符是 CRLF (Rn) ,而在 linux 中是 LF (N)。这通常可以在文本编辑器中选择。

在我的例子中,这是由于在 Windows 上工作和上传到 Unix 服务器执行造成的。

我找到了我的 Ubuntu18给你的解决方案。

sudo dpkg --add-architecture i386

然后:

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

尝试运行 terraform/terragrunt (单程二进制)时出现此错误。

使用 which terragrunt查找可执行文件的位置,在本地目录或全路径下运行时出现奇怪的错误

bash: ./terragrunt: No such file or directory

问题是,有两个安装的 terragrunt,使用 brew uninstall terragrunt删除一个固定的。

移除一个后,which terragrunt显示新的路径 /usr/bin/terragrunt一切工作正常。

在我的案例中,这个文件是一个符号链接:

$ cat deluge-gtk.lock
cat: deluge-gtk.lock: No such file or directory
$ file deluge-gtk.lock
deluge-gtk.lock: broken symbolic link to 32309

这样的误导性错误在 Linux 上相当常见

尝试更改在终端/命令提示符中没有显示的文件或文件夹的名称。

步骤1: 更改文件或文件夹的名称。 第二步: cd 文件名/文件夹名

对于那些在运行 java 程序时遇到这个错误的人来说,可能您正在尝试在32位 linux 操作系统上运行一个64位 java 程序。

当我在64位 Java 上运行 有限公司时,我才意识到:

Ldd/usr/java/jdk1.8.0 _ 05/bin/java

“不是动态可执行文件”

而旧的32位 java 报告了合理的结果:

Ldd/usr/java/jdk1.8.0 _ 05/bin/java

对于未来的读者,我在尝试使用 gunicorn 启动 Django 服务器时遇到了这个问题。我使用 AWS CodeBuild 构建虚拟环境并运行测试,使用 CodeDeploy 将构建的构件放到生产服务器上并启动新版本(所有环境都是 Ubuntu 20.04)。我曾错误地认为 env/bin/...包含本机库的实际二进制文件,但事实并非如此。它只是 Python 脚本,带有构建机器上 Python 解释器的路径。在我的例子中,安装软件包和实际运行软件包的机器是不同的。更具体地说,env/bin中的所有文件都具有 shebang #!/codebuild/output/src715682316/src/env/bin/python,因此在生产服务器上运行 env/bin/gunicorn当然会失败。当 Ubuntu 告诉我 env/bin/gunicorn不存在,而不是说 /codebuild/output/src715682316/src/env/bin/python不存在时,出现了一个神秘的错误消息。我能够解决这个问题,启动枪角兽使用 python3 env/bin/gunicorn而不是 env/bin/gunicorn