Bash 说文件不存在,但实际上文件确实存在

Bash 说文件不存在,但实际上文件确实存在

我正在尝试为我的 linksys WRVS4400N 编译固件。

ls显示存在,但尝试运行时,bash 说它不存在。我也能找到cat它,它是一个可执行文件,而不是 shell 脚本。

答案1

您提到 的输出file mkdep32-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 中的所有更改,现在它运行良好!!!

相关内容