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

11

Ich versuche die Firmware für meine linksys WRVS4400N zu kompilieren.

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

Avery3R
quelle
Was ist die Ausgabe von ls -la für diese bestimmte Datei?
user389238
@Ansis -rwxrwxrwx 1 1011 1011
31991
1
Zeigen Sie uns die Zeile aus Ihrem Skript und die genaue Fehlermeldung. Was ist Ihr aktuelles Verzeichnis, wenn Sie versuchen, die "fehlende" Datei aufzurufen?
Glenn Jackman
@glenn Es ist nicht mein Skript, das es aufruft, es ist das Makefile von Cisco. Ich kann die genaue Fehlermeldung nicht erhalten, da es in einer VM ausgeführt wird, aber Bash: / pathto / mkdep Datei oder Ordner nicht gefunden
Avery3R
Dort verstecken sich diese Trolle ...
Durchbruch

Antworten:

8

Sie haben erwähnt, dass die Ausgabe von file mkdepist 32-bit elf. Sie verwenden eine 64-Bit-VM.

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.

Bahamat
quelle
1
Wenn Sie ia32-libs installieren, sollte es danach funktionieren. Sie müssen keine 32-Bit-VM erstellen.
Phil
5

Ist es auf ausführbar eingestellt? Wenn nicht, dann chmod +x filename. Ist es in deinem Pfad? Wenn nicht, dann nenne es ./filenameeher als nur filename.

frabjous
quelle
Es ist auf ausführbar eingestellt, ich habe ./mkdep gemacht, um es aufzurufen und den vollständigen Pfad zu verwenden, keine Würfel.
Avery3R
Möglicherweise müssen Sie die Datei als sudo ausführen.
D'Arvit
2

Wenn Sie versuchen, eine Datei auszuführen und bash sagt, dass sie nicht existiert, bedeutet dies manchmal, dass bash glaubt, dass die Datei ein Skript ist und dass der in der ersten Zeile (#!) Angegebene Interpreter nicht existiert.

Wenn die Dateien benannt sind, mkdepwürde ich die Ausgabe von posten

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

Der Befehl strace gibt Informationen zu durchgeführten Systemaufrufen strace ls 2>ls.tan und fü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)
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 (Keine solche Datei oder kein solches Verzeichnis)
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
RedGrittyBrick
quelle
(läuft auf VM, zu faul, um alles auszutippen) ./mkdep gibt Datei oder Ordner zurück, die nicht gefunden wurden. Datei mkdep gibt 32-Bit-Elfen-Exe zurück, und Kopf mkdep gibt binäre Daten zurück
Avery3R
1
mkdep generiert möglicherweise diese Nachricht, weil es keine benötigte Datei finden kann?
Linker3000
@ Linker3000: Nein, es heißt Bash: / dirto / mkdep: Datei oder Ordner nicht gefunden
Avery3R
@MMavipc: Versuchen Sie strace ./mkdep 2>mkdep.strace.txtdies sollte Ihnen eine Vorstellung davon geben, was los ist. Möglicherweise müssen Sie strace aus Repositorys installieren.
RedGrittyBrick
1

Ändern Sie IFS in Ihrem Skript? Auch ich bin in einem meiner Skripte auf dasselbe Problem gestoßen und habe dasselbe gedacht (32-Bit-Datei wird vom Shell-Skript auf einem 64-Bit-Computer gelesen). Aber das war in meinem Fall nicht das Problem. Stattdessen habe ich IFS in Komma 'und' zurück in eine neue Zeile geändert, was den Parser irgendwie verwirrte und diesen Fehler verursachte.

Ich habe gerade jede Änderung in IFS entfernt und es funktioniert jetzt einwandfrei !!!

Abhijit Buchake
quelle