Nessun file o directory con questo nome? Ma il file esiste!


186

Ho scaricato un gioco (Shank) ma il file bin non viene eseguito. L'errore che viene visualizzato quando provo ad avviare l'eseguibile è:

bash: ./shank-linux-120720110-1-bin: No such file or directory

2
Forse prima "chmod u + x ./shank*bin"?
agente86

inoltre non dovrebbe essere '.bin' piuttosto che '-bin', forse è solo un errore di battitura
Anake

Grazie per la risposta. Ho fatto il comando che hai detto Agent86 ma ho lo stesso risultato. Ho scaricato anche il file .deb ma c'è anche un problema. Non so quale problema abbia questo gioco.
Francesco,

Conferma se stai eseguendo un'installazione a 64 bit (questo è il caso più comune per questo problema).
Gilles,

Sì, confermo che sto usando un'architettura a 64 bit sul mio laptop.
Francesco,

Risposte:


236

Probabilmente stai cercando di eseguire un binario a 32 bit su un sistema a 64 bit in cui non è installato il supporto a 32 bit.

Esistono tre casi in cui è possibile ottenere il messaggio "Nessun file o directory":

  • Il file non esiste. Presumo che tu abbia verificato che il file esiste (forse perché la shell lo completa).
  • Esiste un file con quel nome, ma è un collegamento simbolico penzolante.
  • Il file esiste e puoi persino leggerlo (ad esempio, il comando file shank-linux-120720110-1-binvisualizza qualcosa come "eseguibile LSB a 32 bit ELF ..."), eppure quando tenti di eseguirlo ti viene detto che il file non esiste.

Il messaggio di errore in quest'ultimo caso è certamente confuso. Quello che ti dice è che manca un componente chiave dell'ambiente di runtime necessario per eseguire il programma. Sfortunatamente, il canale attraverso il quale viene segnalato l'errore ha solo spazio per il codice di errore e non per queste informazioni extra che è la colpa dell'ambiente di runtime. Se si desidera la versione tecnica di questa spiegazione, leggere Come ottenere il messaggio "Non trovato" quando si esegue un file binario a 32 bit su un sistema a 64 bit .

Il filecomando ti dirà che cos'è questo binario. Con poche eccezioni, è possibile eseguire solo un binario per l'architettura del processore per cui è prevista la versione di Ubuntu. L'eccezione principale è che è possibile eseguire binari a 32 bit (x86, aka IA32) su sistemi a 64 bit (amd64, aka x86_64).

In Ubuntu fino alla 11.04, per eseguire un file binario a 32 bit su un'installazione a 64 bit, è necessario installare il ia32-libspacchetto Installa ia32-libs . Potrebbe essere necessario installare librerie aggiuntive (in tal caso riceverai un messaggio di errore esplicito).

Da quando l'11.10 (onirico) ha introdotto il supporto multiarch , è ancora possibile installare ia32-libs, ma è possibile scegliere un approccio più fine, che è sufficiente per ottenere (oltre a qualsiasi altra libreria necessaria).libc6-i386 Installa libc6-i386


Grazie per un'ottima risposta, Gilles. Anche se non ho riscontrato questo problema (ancora!), Ho archiviato la tua risposta per riferimento futuro.
Jim C,

Grazie per la tua esaustiva risposta! Il file bin che ho scaricato era l'unico disponibile in questo formato (bin). Quindi penso che sia buono per tutte le architetture. Ho anche scaricato il file .deb per la mia architettura (64 bit) ma con errori diversi. A questo punto penso che il gioco sia influenzato da alcuni bug o non riesco a installare questo gioco. Ora provo a scaricare libc6-i386 e provo ancora a installarlo. Scriverò di nuovo se ci sono cambiamenti significativi. Grazie per il tuo tempo.
Francesco,

2
@Francesco Pubblica la soluzione! È probabile che aiuti altre persone che cercano di eseguire Shank su Ubuntu. Va perfettamente bene rispondere alla tua domanda .
Gilles,

1
Puoi usare lddper verificare se ti manca una libreria. ldd kgio_ext.sopotrebbe dire qualcosa di simile libruby.so.2.3 => not foundtra gli altri
EnabrenTane,

1
Apparentemente c'è un altro scenario in cui bash: ...some...path...: No such file or directorypuò apparire: dopo aver spostato il file eseguibile. Bash sembra memorizzare nella cache i percorsi degli eseguibili trovati in $ PATH; corri hash -rper cancellarlo. Vedi: unix.stackexchange.com/a/5610/11352
akavel

53

Sistemi Multiarch Ubuntu a 64 bit

Segui questa risposta solo se l'output di file file-namespettacoli,

file-name: ELF 32-bit LSB  executable, Intel 80386, version 1 (SYSV), dynamically linked (uses shared libs), for GNU/Linux 2.6.8, not stripped

Per eseguire file eseguibile a 32 bit in un ambiente multi-arch sistema Ubuntu a 64 bit, è necessario aggiungere i386l'architettura e anche necessario installare libc6:i386, libncurses5:i386, libstdc++6:i386questi tre pacchetti di libreria.

sudo dpkg --add-architecture i386
sudo apt-get update
sudo apt-get install libc6:i386 libncurses5:i386 libstdc++6:i386
./file-name

Vorrei usare sudo per l'ultimo comando: lanciare un binario a 32 bit (quindi ovviamente non compilato da te o Ubuntu) in quanto sudo potrebbe essere rischioso. (beh, anche come non root, a dire il vero)
alci

qualunque cosa possa essere, ma alla fine funziona.
Avinash Raj,

1
Va notato che se si utilizza CentOS o RedHat, questa risposta non si applica. È stato espulso per alcune ore a causa di ciò.
omike il

1
Su Kali 2 64 bit, dovevo solo installarelibselinux1:i386
Aralox

4

Installando il deb per 32 bit mi sono reso conto che mancavano alcune librerie (oltre a ia32-libs e libc6). Ho prima risolto questo problema dando questo comando:

sudo apt-get install -f          

Quindi ho ricevuto un altro errore:

Message: SDL_GL_LoadLibrary 
Error: Failed loading libGL.so.1

Ovviamente, queste librerie sono state installate correttamente. Senza entrare nei dettagli ho dovuto collegare le librerie a mano. Mi sono reso conto quindi che una soluzione più semplice tramite Synaptic poteva installare i seguenti pacchetti:

libgl1-mesa-glx:i386
libgl1-mesa-dri: i386.

Successivamente il problema successivo è stato lo schermo nero durante la riproduzione, che ho risolto sostituendo l'eseguibile in / Shank / bin con questo: http://treefort.icculus.org/smb/smb-linux-mesa-hotfix-test.tar .bz2 .

Spero che sia utile a qualcuno. Se hai bisogno di ulteriore aiuto o maggiori dettagli, non esitare a contattarmi.


3

Ecco una trascrizione che mostra un po 'di più sulla natura del problema e su come risolverlo a partire da Ubuntu 16.04. Si noti che anche se i filereport "sono collegati dinamicamente", i lddreport "non sono eseguibili dinamici".

$ ./myprogram
bash: myprogram: No such file or directory

$ file myprogram
myprogram: ELF 32-bit LSB executable, Intel 80386, version 1 (SYSV), dynamically linked, interpreter /lib/ld-linux.so.2, for GNU/Linux 2.2.5, not stripped

$ ldd myprogram
    not a dynamic executable

Una volta installato libc6: i386, le cose iniziano a migliorare ...

$ sudo apt-get install libc6:i386 # the initial fix
...

$ ldd myprogram
    linux-gate.so.1 =>  (0xf77fd000)
    libc.so.6 => /lib/i386-linux-gnu/libc.so.6 (0xf7626000)
    /lib/ld-linux.so.2 (0x56578000)

$ ./myprogram
myprogram: error while loading shared libraries: libstdc++.so.6: cannot open shared object file: No such file or directory

Per completare il lavoro, potrebbe essere necessario identificare e installare librerie aggiuntive una alla volta ...

$ sudo apt-get install libstdc++6:i386 ## may require various additional libs

$ ./myprogram
... works correctly ...

Non so se esiste un modo sistematico per identificare le librerie corrette da installare. C'è un po 'di congetture che mappano i messaggi di errore sui nomi dei pacchetti (il completamento della scheda aiuta).


ldd(erroneamente) riporta "non un eseguibile dinamico".
nobar,

3

Per espandere la risposta @Gilles, ci sono almeno tre scenari con questo errore:

  1. Il file non esiste.
  2. Il file esiste ma è un collegamento simbolico penzolante.
  3. Il file esiste (ad es. Il filecomando funziona), creando un messaggio di errore sconcertante. Ciò può significare che c'è un problema con il caricatore.

Categorie di problemi del caricatore:

  1. Il caricatore di un eseguibile non esiste. Puoi verificarlo usando il comando file e vedere se il caricatore esiste. Per esempio

    file lmgrd
    lmgrd: ELF 64-bit LSB executable, x86-64, version 1 (SYSV), dynamically linked, interpreter /lib64/ld-lsb-x86-64.so.3, for GNU/Linux 2.6.18, stripped
    

    Avviso interpreter /lib64/ld-lsb-x86-64.so.3; se questo file non esiste, è necessario installarlo. Per questo particolare caricatore del 16.04, la risposta si è rivelata essere sudo apt-get install lsb.

  2. Problemi con il caricatore di uno script (vedi questa risposta ).

  3. Librerie condivise mancanti: utilizzare ldd <file-name>per verificare la presenza di librerie "non trovate". Vedi questa risposta per maggiori informazioni.

Il caricatore inesistente potrebbe essere dovuto a una mancata corrispondenza a 32/64 bit o ad altri motivi. Potrebbero esserci altri tipi di errori del caricatore che non conosco.


1
Nel mio caso, file lmutilnon ho mostrato l'interprete, ma l' lddho fatto e l'installazione ha lsbrisolto il problema.
davidA
Utilizzando il nostro sito, riconosci di aver letto e compreso le nostre Informativa sui cookie e Informativa sulla privacy.
Licensed under cc by-sa 3.0 with attribution required.