Bash 說文件不存在,但它確實存在

Bash 說文件不存在,但它確實存在

我正在嘗試為我的 linksys WRVS4400N 編譯韌體。

ls顯示存在,但是當它嘗試運行它時,bash 說它不存在。我也可以cat,而且它是一個可執行文件,而不是 shell 腳本。

答案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 位元 VM 並在那裡編譯即可。

答案2

是否設定為可執行?如果沒有,那麼chmod +x filename。它在你的路徑中嗎?如果不是,則稱為“./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 vars */]) = 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?我在我的一個腳本中也遇到了同樣的問題,也有同樣的想法(64 位元機器上的 shell 腳本正在讀取 32 位元檔案)。但這不是我的問題。相反,我將 IFS 更改為逗號“,”,然後返回新行,這在某種程度上混淆了解析器並導致了此錯誤。

我剛剛刪除了 IFS 中的任何更改,現在它工作得很好!

相關內容