Bash сообщает, что файл не существует, но это не так

Bash сообщает, что файл не существует, но это не так

Я пытаюсь скомпилировать прошивку для моего Linksys WRVS4400N.

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

решение1

Вы упомянули, что вывод file mkdep32-bit elf. Вы используете 64-битную виртуальную машину.

Пример:

$ uname -m
x86_64
$ ls -l ./example 
-rwxr-xr-x 1 root root 92312 2011-08-18 16:52 ./example
$ file ./example 
example: ELF 32-bit LSB executable, Intel 80386, version 1 (SYSV), dynamically linked (uses shared libs), for GNU/Linux 2.6.8, stripped
$ ./example 
-bash: ./example: No such file or directory

Просто создайте новую 32-битную виртуальную машину и скомпилируйте ее там.

решение2

Настроен ли он как исполняемый? Если нет, то chmod +x filename. Он в вашем PATH? Если нет, то назовите его как , ./filenameа не просто filename.

решение3

Когда вы пытаетесь выполнить файл, а bash сообщает, что он не существует, это иногда означает, что bash считает файл скриптом и что интерпретатор, указанный в первой строке (#!), не существует.

Если файлы имеют имя, mkdepя бы опубликовал вывод

./mkdep
file mkdep
hd mkdep | head
strace ./mkdep 2>mkdep.strace.txt

Команда strace выдает информацию о выполненных системных вызовах, например, strace ls 2>ls.tпомещает следующее в ls.t

execve("/bin/ls", ["ls"], [/* 22 переменные */]) = 0
брк(0) = 0x8061000
access("/etc/ld.so.nohwcap", F_OK) = -1 ENOENT (Нет такого файла или каталога)
mmap2(NULL, 8192, PROT_READ|PROT_WRITE, MAP_PRIVATE|MAP_ANONYMOUS, -1, 0) = 0xb7f82000
access("/etc/ld.so.preload", R_OK) = -1 ENOENT (Нет такого файла или каталога)
открыть("/etc/ld.so.cache", O_RDONLY) = 3
fstat64(3, {st_mode=S_IFREG|0644, st_size=32311, ...}) = 0
mmap2(NULL, 32311, PROT_READ, MAP_PRIVATE, 3, 0) = 0xb7f7a000
закрыть(3) = 0
access("/etc/ld.so.nohwcap", F_OK) = -1 ENOENT (Нет такого файла или каталога)
открыть("/lib/librt.so.1", O_RDONLY) = 3
прочитать(3, "\177ELF\1\1\1\0\0\0\0\0\0\0\0\0\0\3\0\3\0\1\0\0\0\240\30\0\0004\0\0\0"..., 512) =512
fstat64(3, {st_mode=S_IFREG|0644, st_size=30624, ...}) = 0

решение4

Вы меняете IFS в своем скрипте? Я тоже столкнулся с той же проблемой в одном из своих скриптов и думал то же самое (32-битный файл считывается скриптом оболочки на 64-битной машине). Но в моем случае проблема была не в этом. Вместо этого я менял IFS на запятую ',' и обратно на новую строку, что каким-то образом сбивало с толку парсер и вызывало эту ошибку.

Я только что удалил все изменения в IFS, и теперь все работает отлично!!!

Связанный контент