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

时间:2010-10-16 14:00:06

标签: shell command-line executable

我只想从命令行./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

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

14 个答案:

答案 0 :(得分:63)

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

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

答案 1 :(得分:18)

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

我希望每当我们跨平台编辑文件时都要注意,我们也应该注意文件格式。

答案 2 :(得分:15)

如果尝试运行脚本并且shebang拼写错误,也可能会出现此错误。确保它显示为#!/bin/sh#!/bin/bash或您正在使用的任何翻译。

答案 3 :(得分:7)

我在尝试运行Python脚本时遇到了同样的错误消息 - 这不是@Warpspace的预期用例(请参阅其他评论),但这是我搜索的热门点击之一,所以也许有人会发现它很有用

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

答案 4 :(得分:4)

对于没有32/64位问题的简单bash脚本,我遇到了同样的错误。这可能是因为您尝试运行的脚本中存在错误。这个ubuntu forum post表示使用普通脚本文件可以在前面添加“sh”,你可以从中获得一些调试输出。 e.g。

$ sudo sh arm-mingw32ce-g++

并查看是否有任何输出。

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

答案 5 :(得分: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

答案 6 :(得分:2)

我收到此错误“No such file or directory”但它存在是因为我的文件是在Windows中创建的,我试图在Ubuntu上运行它,并且该文件包含无效的15 \ r \ n,其中有新的行。 我刚创建了一个截断不需要的东西的新文件

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 

答案 7 :(得分:1)

我在Mac上创建的文件遇到了同样的问题。 如果我尝试在带有./filename的shell中运行它,我得到了找不到文件的错误消息。 我认为这个文件有问题。

我做了什么:

打开服务器的ssh会话
猫文件名
将输出复制到剪贴板
rm文件名
触摸文件名
vi文件名
我用于插入模式
粘贴剪贴板中的内容
ESC结束插入模式
:WQ

这对我有用。

答案 8 :(得分:1)

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

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

答案 9 :(得分:1)

我找到了适用于Ubuntu 18 here的解决方案。

sudo dpkg --add-architecture i386

然后:

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

答案 10 :(得分:0)

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

您可以通过更改可执行文件使用的加载器来修复它,请参见我在另一个问题中的详尽解答:Multiple glibc libraries on a single host

基本上,您必须找到它要使用的装载程序:

$ 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的路径,在尝试运行它之后,您将知道是否需要它。查看该其他线程中的所有详细信息。

答案 11 :(得分:0)

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

答案 12 :(得分:0)

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

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

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

答案 13 :(得分:0)

尝试运行terraform / terragrunt(单执行二进制操作)时遇到此错误。

使用which terragrunt查找可执行文件的位置,在本地目录或具有完整路径的可执行文件中出现奇怪的错误

bash: ./terragrunt: No such file or directory

问题是有两个terragrunt安装,使用brew uninstall terragrunt删除了一个已修复的问题。

删除该路径后,which terragrunt显示了新路径/usr/bin/terragrunt,一切正常。