我正在尝试为我的 linksys WRVS4400N 编译固件。
ls
显示存在,但尝试运行时,bash 说它不存在。我也能找到cat
它,它是一个可执行文件,而不是 shell 脚本。
答案1
您提到 的输出file mkdep
是32-bit elf
。您正在运行 64 位 VM。
例子:
$ 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 位 VM 并在那里进行编译。
答案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 brk(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\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 位机器上的 shell 脚本读取)。但这不是我的情况。相反,我将 IFS 更改为逗号“,”然后改回新行,这不知何故使解析器感到困惑并导致了此错误。
我刚刚删除了 IFS 中的所有更改,现在它运行良好!!!