Данный файл или каталог отсутствует? Но файл существует!
Я скачал игру (Shank), но файл bin не запускается. Ошибка, которая отображается при попытке запустить исполняемый файл:
bash: ./shank-linux-120720110-1-bin: No such file or directory
9 ответов
Вероятно, вы пытаетесь запустить 32-разрядный двоичный файл в 64-разрядной системе, в которой не установлена 32-разрядная поддержка.
В трех случаях вы можете получить сообщение "Нет такого файла или каталога":
- Файл не существует. Я предполагаю, что вы проверили, что файл существует (возможно, потому что оболочка завершает его).
- Файл с таким именем существует, но это свисающая символическая ссылка.
- Файл существует, и вы даже можете прочитать его (например, команда
file shank-linux-120720110-1-bin
отображает что-то вроде "ELF 32-bit LSB исполняемый файл…"), и все же, когда вы пытаетесь выполнить его, вам говорят, что файл не существует.
Сообщение об ошибке в этом последнем случае, по общему признанию, сбивает с толку. Это говорит о том, что отсутствует ключевой компонент среды выполнения, необходимый для запуска программы. К сожалению, канал, по которому сообщается об ошибке, имеет место только для кода ошибки, а не для этой дополнительной информации, которая действительно виновата в среде выполнения. Если вам нужна техническая версия этого объяснения, прочитайте сообщение Получение "Не найдено" при запуске 32-разрядного двоичного файла в 64-разрядной системе.
file
Команда скажет вам, что это за двоичный файл. За некоторыми исключениями, вы можете запустить только двоичный файл для архитектуры процессора, для которой предназначен ваш выпуск Ubuntu. Основным исключением является то, что вы можете запускать 32-битные (x86, aka IA32) двоичные файлы в 64-битных (amd64, aka x86_64) системах.
В Ubuntu до 11.04 для запуска 32-разрядного двоичного файла в 64-разрядной установке необходимо установить ia32-libs
пакет , Возможно, вам придется установить дополнительные библиотеки (в противном случае вы получите явное сообщение об ошибке).
Так как 11.10 (oneiric) представила поддержку multiarch, вы все равно можете установить ia32-libs
, но вы можете выбрать более детальный подход, достаточно получить libc6-i386
(плюс любая другая необходимая библиотека).
64-битные системы Ubuntu Multiarch
Следуйте этому ответу, только если вывод file file-name
шоу,
file-name: ELF 32-bit LSB executable, Intel 80386, version 1 (SYSV), dynamically linked (uses shared libs), for GNU/Linux 2.6.8, not stripped
Чтобы запустить 32-битный исполняемый файл в 64-битной многоархивированной системе Ubuntu, вы должны добавить i386
архитектура, а также вы должны установить libc6:i386
,libncurses5:i386
,libstdc++6:i386
эти три библиотечных пакета.
sudo dpkg --add-architecture i386
sudo apt-get update
sudo apt-get install libc6:i386 libncurses5:i386 libstdc++6:i386
./file-name
Чтобы расширить ответ @Gilles, есть как минимум три сценария, приводящие к этой ошибке:
- Файл не существует.
- Файл существует, но является висячей символической ссылкой.
- Файл существует (например,
file
команда работает), делая загадочные сообщения об ошибках. Это может означать, что есть проблема с загрузчиком.
Категории проблем с загрузчиком:
Загрузчик исполняемого файла не существует. Вы можете проверить это с помощью команды file и посмотреть, существует ли загрузчик. Например
file lmgrd lmgrd: ELF 64-bit LSB executable, x86-64, version 1 (SYSV), dynamically linked, interpreter /lib64/ld-lsb-x86-64.so.3, for GNU/Linux 2.6.18, stripped
уведомление
interpreter /lib64/ld-lsb-x86-64.so.3
; если этот файл не существует, вам необходимо установить его. Для данного конкретного загрузчика 16.04 ответ оказалсяsudo apt-get install lsb
,Проблемы с загрузчиком скрипта (см. Этот ответ).
- Отсутствуют общие библиотеки - используйте
ldd <file-name>
проверить наличие "не найденных" библиотек. Смотрите этот ответ для получения дополнительной информации.
Загрузчик не существует может быть из-за несоответствия 32/64 бит или по другой причине. Могут быть и другие ошибки загрузчика, о которых я не знаю.
Вот расшифровка стенограммы, показывающая немного больше о природе проблемы и о том, как ее исправить, начиная с Ubuntu 16.04. Обратите внимание, что хотя file
отчеты "динамически связаны", ldd
сообщает "не динамический исполняемый файл".
$ ./myprogram
bash: myprogram: No such file or directory
$ file myprogram
myprogram: ELF 32-bit LSB executable, Intel 80386, version 1 (SYSV), dynamically linked, interpreter /lib/ld-linux.so.2, for GNU/Linux 2.2.5, not stripped
$ ldd myprogram
not a dynamic executable
После установки libc6:i386 все начинает улучшаться...
$ sudo apt-get install libc6:i386 # the initial fix
...
$ ldd myprogram
linux-gate.so.1 => (0xf77fd000)
libc.so.6 => /lib/i386-linux-gnu/libc.so.6 (0xf7626000)
/lib/ld-linux.so.2 (0x56578000)
$ ./myprogram
myprogram: error while loading shared libraries: libstdc++.so.6: cannot open shared object file: No such file or directory
Чтобы завершить работу, вам может понадобиться определить и установить дополнительные библиотеки по одной за раз...
$ sudo apt-get install libstdc++6:i386 ## may require various additional libs
$ ./myprogram
... works correctly ...
Я не знаю, существует ли систематический способ определения правильных библиотек для установки. Есть немного догадок, отображающих сообщения об ошибках на имена пакетов (помогает завершение табуляции).
Установив deb для 32-битной системы, я понял, что мне не хватает некоторых библиотек (в дополнение к ia32-libs и libc6). Сначала я решил эту проблему, дав следующую команду:
sudo apt-get install -f
Тогда я получил еще одну ошибку:
Message: SDL_GL_LoadLibrary
Error: Failed loading libGL.so.1
Очевидно, что эти библиотеки были правильно установлены. Не вдаваясь в детали, мне пришлось связывать библиотеки вручную. Тогда я понял, что через Synaptic можно было бы также проще установить следующие пакеты:
libgl1-mesa-glx:i386
libgl1-mesa-dri: i386.
После этого следующей проблемой был черный экран во время игры, который я решил, заменив исполняемый файл в /Shank/bin следующим: http://treefort.icculus.org/smb/smb-linux-mesa-hotfix-test.tar.bz2.
Надеюсь это кому-нибудь пригодится. Если вам нужна дополнительная помощь или более подробная информация, пожалуйста, не стесняйтесь связаться со мной.
Эта ошибка возникает при работе в Windows (которая вводит дополнительные символы из-за другого разделителя строк, чем в системе Linux) и при попытке запустить этот сценарий (с добавленными дополнительными символами) в Linux. Сообщение об ошибке вводит в заблуждение.
В Windows разделителем строк является CRLF (\r\n), тогда как в Linux это LF (\n). В моем случае это произошло из-за работы в Windows и загрузки на сервер Unix для выполнения.
Google направил меня на эту страницу. Моя проблема была отдаленно связана с названием этой ветки, поэтому я публикую ее здесь для будущих посетителей, таких как я:
Это одна из самых странных проблем:
$ ls -lh
ls: cannot access .~dataprep.ipynb: No such file or directory
-????????? ? ? ? ? ? .~dataprep.ipynb
-rw------- 1 tgowda mygroup 475K Jun 12 15:59 dataprep.ipynb
Я вижу что файл
.~dataprep.ipynb
прямо там с каким-то странным
??
разрешения. Я просто хотел избавиться от этого испорченного файла.rm
Команда не смогла его удалить.
mv
команда не могла его переместить.
А потом...
$ python
>>> from pathlib import Path
>>> list(Path('.').glob("*.ipynb"))
[PosixPath('.~dataprep.ipynb'), PosixPath('dataprep.ipynb')]
>>> p = list(Path('.').glob("*.ipynb"))[0]
>>> p
PosixPath('.~dataprep.ipynb')
>>> p.unlink()
>>> list(Path('.').glob("*.ipynb"))
[PosixPath('dataprep.ipynb')]
И вот как я смог победить это.
Как размещено в /questions/602394/dannyij-fajl-ili-katalog-otsutstvuet-no-fajl-suschestvuet/602413#602413
sudo apt-get install lsb
решил проблему
Ни один из приведенных выше ответов не сработал для меня, потому что у переводчика было неправильное разрешение.
Я написал подробный ответ здесь , объясняя, как решить эту проблему.
Спасибо этому человеку, который поделился своим опытом с другими решениями здесь. благодаря ему я смог решить эту проблему.
Подводя итог, как @steeldriver, возникла проблема с интерпретатором. компоновщик дает моей программе [/lib/ld64.so.1] интерпретатор ELF, но этот путь вообще не существует, и я проверил его:
> ls /lib/ld64.so.1 ls: cannot access '/lib/ld64.so.1': No such file or directory
После этого я проверил путь интерпретатора в моей установке Ubuntu:
> ls /lib64/ld-* /lib64/ld-linux-x86-64.so.2 /lib64/ld-lsb-x86-64.so.2 /lib64/ld-lsb-x86-64.so.3
поэтому решение состоит в том, чтобы создать ссылку одного из этих интерпретаторов на несуществующий путь интерпретатора:
Теперь мы еще раз перепроверяем несуществующий интерпретатор, чтобы убедиться, что он еще не существует:
> ls /lib/ld64.so.1 /lib/ld64.so.1
Теперь эта команда вернула /lib/ld64.so.1 вместо «несуществующий файл». так что проблема была решена, и я мог успешно запустить ./main
Итак, в итоге вам нужно создать ссылку одного из этих интерпретаторов на несуществующий путь интерпретатора, выполнив следующую команду в терминале (Ctrl+ Alt+ T):
sudo ln -s /lib64/ld-linux-x86-64.so.2 /lib/ld64.so.1