Bashはファイルが存在しないと表示しますが、実際には存在します

Bashはファイルが存在しないと表示しますが、実際には存在します

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

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

答え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 を変更していますか? 私もスクリプトの 1 つで同じ問題に遭遇し、同じように考えました (32 ビット ファイルが 64 ビット マシン上のシェル スクリプトによって読み取られる)。しかし、私の場合はそれが問題ではありませんでした。代わりに、IFS をコンマ ',' に変更し、新しい行に戻していたため、何らかの理由でパーサーが混乱し、このエラーが発生しました。

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

関連情報