Bash sagt, dass die Datei nicht existiert, aber sie existiert

Bash sagt, dass die Datei nicht existiert, aber sie existiert

Ich versuche, die Firmware für meinen Linksys WRVS4400N zu kompilieren.

lszeigt an, dass es existiert, aber wenn ich versuche, es auszuführen, sagt Bash, dass es nicht existiert. Ich kann cates auch, und es ist eine ausführbare Datei, kein Shell-Skript.

Antwort1

Sie haben erwähnt, dass die Ausgabe file mkdeplautet 32-bit elf. Sie führen eine 64-Bit-VM aus.

Beispiel:

$ 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

Erstellen Sie einfach eine neue 32-Bit-VM und kompilieren Sie sie dort.

Antwort2

Ist es auf ausführbar eingestellt? Wenn nicht, dann chmod +x filename. Befindet es sich in Ihrem PATH? Wenn nicht, dann rufen Sie es als auf, ./filenamestatt nur filename.

Antwort3

Wenn Sie versuchen, eine Datei auszuführen und Bash sagt, dass sie nicht existiert, bedeutet das manchmal, dass Bash glaubt, die Datei sei ein Skript und dass der in der ersten Zeile (#!) angegebene Interpreter nicht existiert.

Wenn die Datei benannt ist, mkdepwürde ich die Ausgabe von veröffentlichen

./mkdep
file mkdep
hd mkdep | head
strace ./mkdep 2>mkdep.strace.txt

Der Befehl strace gibt Informationen über getätigte Systemaufrufe und strace ls 2>ls.tfügt beispielsweise Folgendes in ls.t ein

execve("/bin/ls", ["ls"], [/* 22 vars */]) = 0
brk(0) = 0x8061000
access("/etc/ld.so.nohwcap", F_OK) = -1 ENOENT (Keine solche Datei oder kein solches Verzeichnis)
mmap2(NULL, 8192, PROT_READ|PROT_WRITE, MAP_PRIVATE|MAP_ANONYMOUS, -1, 0) = 0xb7f82000
access("/etc/ld.so.preload", R_OK) = -1 ENOENT (Keine solche Datei oder kein solches Verzeichnis)
öffnen("/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
schließen(3) = 0
access("/etc/ld.so.nohwcap", F_OK) = -1 ENOENT (Keine solche Datei oder kein solches Verzeichnis)
öffnen("/lib/librt.so.1", O_RDONLY) = 3
lesen(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

Antwort4

Ändern Sie IFS in Ihrem Skript? Ich hatte in einem meiner Skripte dasselbe Problem und dachte das Gleiche (32-Bit-Datei wird von Shell-Skript auf 64-Bit-Maschine gelesen). Aber das war in meinem Fall nicht das Problem. Stattdessen habe ich IFS in ein Komma ,‘ und zurück in eine neue Zeile geändert, was den Parser irgendwie verwirrte und diesen Fehler verursachte.

Ich habe einfach alle Änderungen in IFS entfernt und jetzt funktioniert es einwandfrei!!!

verwandte Informationen