web-dev-qa-db-ja.com

Bashはファイルが存在しないと言っていますが、存在します

Linksys WRVS4400Nのファームウェアをコンパイルしようとしています。

lsはそれが存在することを示していますが、実行しようとすると、bashはそれが存在しないことを示します。 catすることもできます。これは実行可能ファイルであり、シェルスクリプトではありません。

11
Avery3R

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を作成し、そこでコンパイルします。

8
bahamat

実行可能に設定されていますか?そうでない場合は、chmod +x filename。それはあなたのPATHにありますか?そうでない場合は、単にfilenameではなく./filenameとして呼び出します。

5
frabjous

ファイルを実行しようとしたときに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(そのようなファイルまたはディレクトリはありません)
 open( "/ 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 
 close(3)= 0 
 access( "/ etc/ld.so.nohwcap"、F_OK)= -1 ENOENT(そのようなファイルまたはディレクトリはありません)
 open( " /lib/librt.so.1"、O_RDONLY)= 3 
 read(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 
2
RedGrittyBrick

スクリプトのIFSを変更していますか?私も自分のスクリプトの1つで同じ問題に遭遇し、同じように思いました(32ビットファイルが64ビットマシンのシェルスクリプトによって読み取られています)。しかし、私の場合はそれは問題ではありませんでした。代わりに、IFSをコンマ '、'に変更し、改行してパーサーを混乱させ、このエラーを引き起こしていました。

IFSの変更を削除したところ、正常に機能するようになりました。

1
Abhijit Buchake