我正在嘗試為我的 linksys WRVS4400N 編譯韌體。
ls
顯示存在,但是當它嘗試運行它時,bash 說它不存在。我也可以cat
,而且它是一個可執行文件,而不是 shell 腳本。
答案1
您提到 的輸出file mkdep
是32-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 中的任何更改,現在它工作得很好!