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


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

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

149
2018-05-07 19:06


origine


Forse "chmod u + x ./shank*bin" prima? - agent86
inoltre non dovrebbe essere ".bin" piuttosto che "-bin", forse è solo un refuso - 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 ha questo gioco. - Francesco
Si prega di confermare se si sta eseguendo un'installazione a 64 bit (questo è il caso più comune per questo problema). - Gilles
Sì, confermo che sto utilizzando un'architettura a 64 bit sul mio laptop. - Francesco


risposte:


Probabilmente stai tentando di eseguire un binario a 32 bit su un sistema a 64 bit che non ha il supporto a 32 bit installato.

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

  • Il file non esiste. Presumo che tu abbia controllato che il file esista (forse perché la shell lo completa).
  • C'è un file con quel nome, ma è un link simbolico pendente.
  • Il file esiste e puoi persino leggerlo (ad esempio, il comando file shank-linux-120720110-1-bin mostra qualcosa come "ELF a 32 bit LSB eseguibile ..."), eppure quando provi ad eseguirlo ti viene detto che il file non esiste.

Il messaggio di errore in questo ultimo caso è certamente confuso. Quello che ti sta dicendo è 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 spazio solo per il codice di errore e non per questa informazione extra che è proprio l'ambiente runtime da incolpare. Se vuoi la versione tecnica di questa spiegazione, leggi Ottenere il messaggio "Not found" quando si esegue un binario a 32 bit su un sistema a 64 bit.

Il file il comando ti dirà cosa è questo binario. Con poche eccezioni, puoi eseguire solo un binario per l'architettura del processore a cui è destinato il tuo rilascio di Ubuntu. L'eccezione principale è che è possibile eseguire binari a 32 bit (x86, a.k.a. IA32) su sistemi 64-bit (amd64, a.k.a. x86_64).

In Ubuntu fino alla 11.04, per eseguire un binario a 32 bit su un'installazione a 64 bit, è necessario installare il ia32-libs pacchetto  Install ia32-libs. Potrebbe essere necessario installare librerie aggiuntive (riceverai un messaggio di errore esplicito se lo fai).

Dall'11.10 (onirico) introdotto multiarch supporto, è ancora possibile installare ia32-libs, ma puoi scegliere un approccio a grana fine, è sufficiente per ottenere libc6-i386  Install libc6-i386 (più qualsiasi altra libreria necessaria).


201
2018-05-07 21:47



Grazie per l'ottima risposta, Gilles. Anche se non ho ancora riscontrato questo problema (ancora!), Ho archiviato la tua risposta per riferimenti futuri. - Jim C
Grazie per la tua esaustiva risposta! Il raccoglitore di file che ho scaricato era l'unico disponibile in questo formato (bin). Quindi penso sia buono per tutte le architetture. Ho anche scaricato il file .deb per la mia architettura (64 bit) ma con diversi errori. A questo punto penso che il gioco sia affetto da alcuni bug o non riesco ad installare questo gioco. Ora provo a scaricare libc6-i386 e cerco ancora di installarlo. Scriverò di nuovo se ci sono cambiamenti significativi. Grazie per il tuo tempo. - Francesco
@Francesco Si prega di inviare la soluzione! È probabile che aiuti altre persone a tentare di eseguire Shank su Ubuntu. Va perfettamente bene rispondere alla tua stessa domanda. - Gilles
Puoi usare ldd per verificare se ti manca una libreria. ldd kgio_ext.so potrebbe dire qualcosa del genere libruby.so.2.3 => not found tra gli altri - EnabrenTane
Apparentemente c'è un altro scenario in cui bash: ...some...path...: No such file or directory può apparire: dopo aver spostato il file eseguibile. Bash sembra memorizzare nella cache i percorsi degli eseguibili trovati in $ PATH; correre hash -r per cancellarlo. Vedere: unix.stackexchange.com/a/5610/11352 - akavel


Sistemi a 64 bit Ubuntu Multiarch

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

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 sistema Ubuntu multi-arc a 64 bit, è necessario aggiungere i386 architettura e anche tu devi installare libc6:i386,libncurses5:i386,libstdc++6:i386 questi tre pacchetti di librerie.

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

40
2018-04-24 13:14



Userei sudo per l'ultimo comando: lanciare un binario a 32 bit (ovviamente non compilato da te o Ubuntu) poiché sudo potrebbe essere rischioso. (beh, anche se non root, ammettiamolo) - alci
che cosa mai può essere alla fine, ma funziona. - Avinash Raj
È necessario notare che se si utilizza CentOS o RedHat, questa risposta non si applica. È stato buttato via per alcune ore a causa di questo. - oMiKeY
Su Kali 2 64 bit, ho dovuto solo installare libselinux1:i386 - Aralox


Installando il deb per 32 bit mi sono reso conto che mancavano alcune librerie (oltre a ia32-libs e libc6). Per prima cosa ho 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 allora che anche una soluzione più semplice attraverso Synaptic installa i seguenti pacchetti:

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

Dopo che 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 possa essere utile a qualcuno. Se hai bisogno di più aiuto o più dettagli non esitare a contattarmi.


4
2018-05-09 19:12





Ecco una trascrizione che mostra un po 'di più sulla natura del problema e su come risolverlo da Ubuntu 16.04. Si noti che anche se file riporta "collegato dinamicamente", ldd segnala "non un eseguibile dinamico".

$ ./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 ai nomi dei pacchetti (aiuta il completamento delle schede).


3
2018-06-08 20:57



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


Per espandere la risposta @Gilles, ci sono almeno tre scenari che portano a questo errore:

  1. Il file non esiste.
  2. Il file esiste ma è un link simbolico pendente.
  3. Il file esiste (ad es. file comando funziona), creando un messaggio di errore enigmatico. Questo potrebbe 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 loader 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 il 16.04, la risposta si rivelò essere sudo apt-get install lsb.

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

  3. Librerie condivise mancanti: uso ldd <file-name> controllare eventuali librerie "non trovate". Vedere questa risposta per maggiori informazioni.

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


2
2018-05-11 18:54



Nel mio caso, file lmutil non ha mostrato l'interprete, ma ldd fatto, e l'installazione lsb problema risolto. - meowsqueak