«Нет такого файла или каталога», но он существует - PullRequest
73 голосов
/ 16 октября 2010

Я просто хочу запустить исполняемый файл из командной строки ./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

Понятия не имею, почему ОС даже не видит файл, когда он там. Есть мысли?

Ответы [ 10 ]

66 голосов
/ 16 октября 2010

Эта ошибка может означать, что ./arm-mingw32ce-g++ не существует (но существует) или существует и является динамически связанным исполняемым файлом, распознаваемым ядром, но динамический загрузчик которого недоступен.Вы можете увидеть, какой динамический загрузчик требуется, запустив ldd /arm-mingw32ce-g++;все, что помечено not found, является динамическим загрузчиком или библиотекой, которую необходимо установить.

Если вы пытаетесь запустить 32-разрядный двоичный файл в установке amd64:

  • До Ubuntu 11.04 установите пакет ia32-libs.
  • В Ubuntu 11.10 установите ia32-libs-multiarch.
  • Начиная с 12.04, установитеia32-libs-multiarch или выберите разумный набор пакетов :i386 в дополнение к пакетам :amd64.
20 голосов
/ 23 сентября 2015

Я столкнулся с этой ошибкой, когда пытался собрать исходники Selenium в Ubuntu.Простой сценарий оболочки с правильным shebang не смог запуститься даже после того, как были выполнены все предварительные требования.

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.

Я надеюсь, что мы должны заботиться о том, чтобы при редактировании файлов на разных платформах мы заботились и о форматах файлов.

15 голосов
/ 28 января 2014

Эта ошибка также может возникать при попытке запуска скрипта и shebang с ошибкой. Убедитесь, что на нем написано #!/bin/sh, #!/bin/bash или какой переводчик вы используете.

7 голосов
/ 23 февраля 2015

У меня было то же сообщение об ошибке при попытке запуска скрипта Python - это не было предназначением @ Warpspace (см. Другие комментарии), но это было одним из главных попаданий в моем поиске, поэтому, возможно, кто-то найдет его полезным .

В моем случае это был конец линии DOS (\r\n вместо \n), по которому линия Шебанга (#!/usr/bin/env python) могла бы опрокинуться. Простой dos2unix myfile.py исправил это.

4 голосов
/ 27 ноября 2013

Я получил ту же ошибку для простого bash-скрипта, у которого не было бы 32/64-битных проблем. Возможно, это связано с тем, что в скрипте, который вы пытаетесь запустить, есть ошибка. Это сообщение на форуме ubuntu указывает на то, что с обычными файлами сценариев вы можете добавить 'sh' впереди, и вы можете получить отладочный вывод из него. например,

$ sudo sh arm-mingw32ce-g++

и посмотрите, получите ли вы какой-либо вывод.

В моем случае реальная проблема заключалась в том, что файл, который я пытался выполнить, был в формате Windows, а не в Linux.

3 голосов
/ 20 апреля 2018

Команда ниже работает на 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
2 голосов
/ 14 января 2016

Я получил эту ошибку “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 
1 голос
/ 15 июля 2016

У меня только что была эта проблема в mingw32 bash.Я выполнил узел / npm из Program Files (x86)\nodejs, а затем переместил их в каталог disabled (по сути, удалив их из пути).У меня также был Program Files\nodejs (т.е. 64-битная версия) в пути, но только после версии x86.После перезапуска оболочки bash можно найти 64-битную версию npm.node работал правильно все время (проверено с node -v, которое изменилось при перемещении версии x86).

Я думаю, bash -r сработало бы вместо перезапуска bash: https://unix.stackexchange.com/a/5610

1 голос
/ 13 октября 2014

У меня была такая же проблема с файлом, который я создал на моем Mac.Если я пытаюсь запустить его в оболочке с ./filename, я получаю сообщение об ошибке «файл не найден».Я думаю, что что-то не так с файлом.

что я сделал:

открыть сессию ssh на сервере
имя файла cat
скопировать вывод в буфер обмена
rm filename
touch filename
vi filename
i для режима вставки
вставка содержимого из буфера обмена
ESC для завершения режима вставки
: wq!

Это сработало для меня.

0 голосов
/ 12 июля 2019

Как уже упоминалось другими, это потому, что не может быть найден загрузчик, а не ваш исполняемый файл.К сожалению, сообщение недостаточно четкое.

Вы можете исправить это, изменив загрузчик, используемый вашим исполняемым файлом, см. Мой полный ответ на этот другой вопрос: Несколько библиотек glibc на одном хосте

В основном вам нужно найти, какой загрузчик он пытается использовать:

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

Затем найдите правильный путь для эквивалентного загрузчика и измените свой исполняемый файл, чтобы использовать загрузчик из пути, который он действительноis:

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

Вам, вероятно, потребуется также указать путь включений, вы узнаете, хотите ли вы этого или нет, после того, как попытаетесь запустить его.См. Все детали в этой другой теме.

...