Bash twierdzi, że plik nie istnieje, ale tak jest

11

Próbuję skompilować oprogramowanie wewnętrzne dla mojego linksys WRVS4400N.

lspokazuje, że istnieje, ale gdy próbuje go uruchomić, bash mówi, że nie istnieje. Mogę to catzrobić i jest to plik wykonywalny, a nie skrypt powłoki.

Avery3R
źródło
co wyprowadza ls -la dla tego konkretnego pliku?
user389238,
@Ansis -rwxrwxrwx 1 1011 1011 31991 18 maja 2006 mkdep
Avery3R
1
pokaż nam wiersz ze skryptu i dokładny komunikat o błędzie. Jaki jest twój obecny katalog, gdy próbujesz wywołać „brakujący” plik?
glenn jackman
@glenn To nie mój skrypt wywołuje go, to plik makr Cisco, nie mogę uzyskać dokładnego komunikatu o błędzie, ponieważ jest uruchomiony w vm, ale nie znaleziono pliku lub folderu bash: / pathto / mkdep
Avery3R
Więc tam kryją się te trolle ...
Przełom

Odpowiedzi:

8

Wspomniałeś, że wynikiem file mkdepjest 32-bit elf. Używasz 64-bitowej maszyny wirtualnej.

Przykład:

$ 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

Utwórz nową 32-bitową maszynę wirtualną i tam ją skompiluj.

bahamat
źródło
1
Jeśli zainstalujesz ia32-libs, powinien on później działać. Nie ma potrzeby tworzenia 32-bitowej maszyny wirtualnej.
Phil
5

Czy jest ustawiony na wykonywalność? Jeśli nie, to wtedy chmod +x filename. Czy to jest w twojej ŚCIEŻCE? Jeśli nie, to nazwij to ./filenameraczej niż po prostu filename.

frabjous
źródło
Jest ustawiony na wykonywalny, zrobiłem ./mkdep, aby go wywołać, a także używając pełnej ścieżki, bez kości.
Avery3R
Może być konieczne uruchomienie pliku jako sudo.
D'Arvit,
2

Kiedy próbujesz uruchomić plik i bash mówi, że on nie istnieje, czasami oznacza to, że bash wierzy, że plik jest skryptem i że interpreter określony w pierwszym wierszu (#!) Nie istnieje.

Jeśli pliki zostaną nazwane mkdep, opublikowałbym dane wyjściowe

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

Polecenie strace podaje informacje o wykonanych wywołaniach systemowych, na przykład strace ls 2>ls.tumieszcza następujące polecenie w ls.t

execve ("/ bin / ls", ["ls"], [/ * 22 vars * /]) = 0
brk (0) = 0x8061000
access ("/ etc / ld.so.nohwcap", F_OK) = -1 ENOENT (Brak takiego pliku lub katalogu)
mmap2 (NULL, 8192, PROT_READ | PROT_WRITE, MAP_PRIVATE | MAP_ANONYMOUS, -1, 0) = 0xb7f82000
access ("/ etc / ld.so.preload", R_OK) = -1 ENOENT (Brak takiego pliku lub katalogu)
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 (Brak takiego pliku lub katalogu)
open ("/ lib / librt.so.1", O_RDONLY) = 3
czytaj (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
źródło
(działa na vm, zbyt leniwy, aby wszystko napisać) ./mkdep zwraca plik lub folder nie został znaleziony. plik mkdep zwraca 32-bitowy plik elf, a szef mkdep zwraca dane binarne
Avery3R
1
mkdep prawdopodobnie generuje ten komunikat, ponieważ nie może znaleźć potrzebnego pliku?
Linker3000,
@ linker3000: Nie, mówi Bash: / dirto / mkdep: nie znaleziono pliku lub folderu
Avery3R
@MMavipc: spróbuj strace ./mkdep 2>mkdep.strace.txtto dać ci pojęcie o tym, co się dzieje. Być może trzeba zainstalować strace z repozytoriów.
RedGrittyBrick,
1

Zmieniasz IFS w swoim skrypcie? Ja też napotkałem ten sam problem w jednym ze swoich skryptów i pomyślałem tak samo (plik 32-bitowy jest odczytywany przez skrypt powłoki na 64-bitowej maszynie). Ale to nie był problem w moim przypadku. Zamiast tego zmieniłem IFS na przecinek i wróciłem do nowej linii, która jakoś pomieszała parser i spowodowała ten błąd.

Właśnie usunąłem wszelkie zmiany w IFS i teraz działa dobrze !!!

Abhijit Buchake
źródło