«Нет такого файла или каталога», но он существует


94

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

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

Ответы:


82

Эта ошибка может означать, что ./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пакетам.

16
Шикарно, работает! Кстати, вывод ldd был not a dynamic executable(до того, как я установил ia32-libs).
Warpspace

3
ia32-libs-*устарела в Ubuntu 16.04, установите lib32ncurses5и lib32z1вместо этого.
GaloisPlusPlus

2
Это обычная проблема в Nix или NixOS при попытке запустить бинарные файлы сторонних разработчиков; см. патчелф.
bbarker

30

Я столкнулся с этой ошибкой, когда пытался собрать исходный код 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.

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


Это сработало! после нескольких попыток это было решением. Благодарность!
Педро Перес

20

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


4
Я имею в виду исполняемый файл, а не скрипт. Опять же, этот комментарий может оказаться полезным для кого-то еще
Warpspace

1
Верно, но я подошел к этому вопросу именно для этой проблемы, так что, как вы сказали, может быть, кто-то другой тоже.
Zoltán

В моем случае я пытался бежать ./my/full/path/myscriptвместо ./myscript.
Ноумен

8

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

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


4

Я получил ту же ошибку для простого сценария bash, у которого не было бы проблем с 32/64-разрядными версиями. Возможно, это связано с тем, что сценарий, который вы пытаетесь запустить, содержит ошибку. Это сообщение на форуме 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, я получу сообщение об ошибке файл не найден. Я думаю, что с файлом что-то не так.

что я сделал:

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

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


1

У меня только что возникла эта проблема mingw32 bash. Я выполнил node / 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

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

Вы можете исправить это, изменив загрузчик, который использует ваш исполняемый файл, см. Мой подробный ответ в этом другом вопросе: Несколько библиотек 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++

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



0

У меня была эта проблема, и причиной этого был EOL в некоторых редакторах, таких как Notepad ++. Вы можете проверить это в меню Правка / Преобразование 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к scriptdirзначению был добавлен файл в моем отредактированном Windows файле . Таким образом, сообщение : no such file or directoryбыло наиболее запутанным, поскольку в конечном итоге стирало то, на что жаловалось.
Джесси Чисхолм,
Используя наш сайт, вы подтверждаете, что прочитали и поняли нашу Политику в отношении файлов cookie и Политику конфиденциальности.
Licensed under cc by-sa 3.0 with attribution required.