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


93

我只想从命令行运行可执行文件./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

我不知道为什么操作系统在那里时甚至看不到文件。有什么想法吗?

Answers:


81

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

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


16
太棒了!顺便说一句,ldd的输出是not a dynamic executable(在我安装ia32-libs之前)。
Warpspace 2010年

3
ia32-libs-*在Ubuntu 16.04已经过时,安装lib32ncurses5lib32z1代替。
GaloisPlusPlus

2
在尝试运行第三方二进制文件时,这是Nix或NixOS上的常见问题。参见patchelf。
bbarker

29

当我尝试在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.

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


有效!在尝试了多种方法之后,这就是解决方案。谢谢!
Pedro Perez

20

如果尝试运行脚本并且shebang拼写错误,也可能发生此错误。确保它显示#!/bin/sh#!/bin/bash或您正在使用的任何解释器。


4
我指的是可执行文件,而不是脚本。再说一次,其他人可能会觉得此评论有用
Warpspace 2014年

1
是的,但是我针对这个确切的问题着手解决这个问题,所以正如您所说,也许其他人也会这样做。
佐尔坦

就我而言,我尝试运行./my/full/path/myscript而不是./myscript
本体

8

尝试运行Python脚本时,我遇到了相同的错误消息-这不是@Warpspace的预期用例(请参阅其他注释),但这是我搜索的热门内容之一,因此也许有人会发现它很有用。

在我的情况下,shebang行()可能是DOS行的结尾(\r\n而不是\n#!/usr/bin/env python。一个简单的dos2unix myfile.py修复它。


4

对于没有32/64位问题的简单bash脚本,我遇到了相同的错误。这可能是因为您尝试运行的脚本中存在错误。该ubuntu论坛帖子表明,使用常规脚本文件,您可以在前面添加“ sh”,并且可能会从中获取一些调试输出。例如

$ sudo sh arm-mingw32ce-g++

看看是否有任何输出。

就我而言,实际的问题是我尝试执行的文件是Windows格式而不是linux。


3

我收到此错误,“No such file or directory”但它存在是因为我的文件是在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 

3

下面的命令适用于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

1

我在Mac上创建的文件遇到了同样的问题。如果我尝试在具有./filename的shell中运行它,则显示文件未找到错误消息。我认为文件有问题。

我所做的:

打开到服务器的ssh会话
cat文件
名将输出复制到剪贴板
rm文件名
touch文件名
vi文件名
i用于插入模式
将剪贴板
ESC的内容粘贴到结束插入模式
:wq!

这对我有用。


1

我刚遇到这个问题mingw32 bash。我从中执行了node / npm Program Files (x86)\nodejs,然后将它们移到disabled目录中(从路径中基本上删除了它们)。我也有Program Files\nodejs路径(即64位版本),但仅在x86版本之后。重新启动bash shell之后,可以找到64位版本的npm。node一直正常工作(检查node -vx86版本移动时已更改的内容)。

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


1

正如其他人提到的,这是因为找不到加载器,而不是可执行文件。不幸的是,该信息不够清晰。

您可以通过更改可执行文件使用的加载程序来修复它,请参见我在另一个问题中得到的完整答案:单个主机上有多个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的路径,在尝试运行它之后,您将知道是否需要它。查看该其他线程中的所有详细信息。


1

我在这里找到了适用于我的Ubuntu 18的解决方案。

sudo dpkg --add-architecture i386

然后:

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

0

我遇到了这个问题,原因是某些编辑器(例如Notepad ++)中的EOL。您可以在“编辑”菜单/ EOL转换中进行检查。应该选择Unix(LF)。我希望它会有用。


在这种情况下,这不太可能成为问题,因为该命令不是从文件执行的。
RalfFriedl

0

在此处添加以供将来参考(适用于可能会遇到相同情况的用户): 在Windows上工作时(由于与Linux系统不同的行分隔符而引入了额外的字符)并尝试运行此脚本(插入了额外的字符)时,会发生此错误。在Linux中。该错误信息是令人误解的。

在Windows中,行分隔符为CRLF(\ r \ n),而在Linux中,行分隔符为LF(\ n)。通常可以在文本编辑器中选择。

就我而言,这是由于在Windows上工作并上传到Unix服务器上执行而发生的。


1
我使用docker,linux,但从Windows构建它。scriptdir=$(cd "$( dirname "${BASH_SOURCE[0]}" )" && pwd)然后我的脚本开始了,cd $scriptdir || exit 1但是\r在Windows编辑的文件中将追加到该scriptdir值。因此,该消息: no such file or directory最令人困惑,因为它最终消除了其抱怨的内容。
Jesse Chisholm
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.