"Nessun file o directory di questo tipo" ma esiste


93

Voglio semplicemente eseguire un eseguibile dalla riga di comando ./arm-mingw32ce-g++, ma poi ricevo il messaggio di errore,

bash: ./arm-mingw32ce-g++: No such file or directory

Sto eseguendo Ubuntu Linux 10.10. ls -lelenchi

-rwxr-xr-x 1 root root  433308 2010-10-16 21:32 arm-mingw32ce-g++

Usando sudo ( sudo ./arm-mingw32ce-g++) si ottiene

sudo: unable to execute ./arm-mingw32ce-g++: No such file or directory

Non ho idea del motivo per cui il sistema operativo non può nemmeno vedere il file quando è lì. qualche idea?

Risposte:


82

Questo errore può significare che ./arm-mingw32ce-g++non esiste (ma esiste), o che esiste ed è un eseguibile collegato dinamicamente riconosciuto dal kernel ma il cui caricatore dinamico non è disponibile. Puoi vedere quale caricatore dinamico è richiesto eseguendo ldd /arm-mingw32ce-g++; tutto ciò che not foundè contrassegnato è il caricatore dinamico o una libreria che devi installare.

Se stai tentando di eseguire un binario a 32 bit su un'installazione amd64:


16
Fantastico, funziona! A proposito, l'output di ldd era not a dynamic executable(prima di installare ia32-libs).
— Warpspace

3
ia32-libs-*è deprecato in Ubuntu 16.04, installa lib32ncurses5e lib32z1invece.
— GaloisPlusPlus

2
Questo è un problema comune su Nix o NixOS quando si tenta di eseguire binari di terze parti; vedi patchelf.
— bbarker

29

Ho riscontrato questo errore quando stavo cercando di creare il sorgente Selenium su Ubuntu. Il semplice script di shell con lo shebang corretto non è stato in grado di funzionare anche dopo aver coperto tutti i pre-requisiti.

file file-name # helped me in understanding that CRLF ending were present in the file.

Ho aperto il file in Vim e ho potuto vedere che solo perché una volta ho modificato questo file su una macchina Windows, era in formato DOS. Ho convertito il file in formato Unix con il comando seguente:

dos2unix filename # actually helped me and things were fine.

Spero che dovremmo fare attenzione ogni volta che modifichiamo i file su piattaforme diverse dovremmo prenderci cura anche dei formati dei file.


Ha funzionato! dopo aver provato più cose, questa era la soluzione. Grazie!
— Pedro Perez,

20

Questo errore può verificarsi anche se si tenta di eseguire uno script e lo shebang è scritto male. Assicurati che legga #!/bin/sh, #!/bin/basho qualunque interprete stai usando.


4
Mi riferisco a un eseguibile, non a uno script. Poi di nuovo, qualcun altro potrebbe trovare utile questo commento
— Warpspace

1
Vero, ma sono arrivato su questa domanda per questo problema esatto, quindi come hai detto, forse lo farà anche qualcun altro.
— Zoltán

Nel mio caso, stavo cercando di correre ./my/full/path/myscriptinvece di ./myscript.
— Noumenon

8

Ho ricevuto lo stesso messaggio di errore durante il tentativo di eseguire uno script Python: questo non era il caso d'uso previsto da @ Warpspace (vedi altri commenti), ma questo era tra i risultati migliori della mia ricerca, quindi forse qualcuno lo troverà utile.

Nel mio caso erano le terminazioni di riga DOS ( \r\ninvece di \n) su cui inciamperebbe la riga shebang ( #!/usr/bin/env python). Un semplice dos2unix myfile.pyrisolto.


4

Ho ricevuto lo stesso errore per un semplice script bash che non avrebbe problemi a 32/64 bit. Ciò è possibile perché lo script che stai tentando di eseguire contiene un errore. Questo post sul forum di Ubuntu indica che con i normali file di script è possibile aggiungere "sh" davanti e si potrebbe ottenere un output di debug da esso. per esempio

$ sudo sh arm-mingw32ce-g++

e vedi se ottieni qualche risultato.

Nel mio caso il vero problema era che il file che stavo cercando di eseguire era in formato Windows anziché Linux.


3

Ho ricevuto questo errore “No such file or directory”ma esiste perché il mio file è stato creato in Windows e ho provato a eseguirlo su Ubuntu e il file conteneva 15 \ r non validi dove c'era una nuova riga. Ho appena creato un nuovo file che tronca le cose indesiderate

sleep: invalid time interval ‘15\r’
Try 'sleep --help' for more information.
script.sh: 5: script.sh: /opt/ag/cont: not found
script.sh: 6: script.sh: /opt/ag/cont: not found
root@Ubuntu14:/home/abc12/Desktop# vi script.sh 
root@Ubuntu14:/home/abc12/Desktop# od -c script.sh 
0000000   #   !   /   u   s   r   /   b   i   n   /   e   n   v       b
0000020   a   s   h  \r  \n   w   g   e   t       h   t   t   p   :   /

0000400   :   4   1   2   0   /  \r  \n
0000410
root@Ubuntu14:/home/abc12/Desktop# tr -d \\015 < script.sh > script.sh.fixed
root@Ubuntu14:/home/abc12/Desktop# od -c script.sh.fixed 
0000000   #   !   /   u   s   r   /   b   i   n   /   e   n   v       b
0000020   a   s   h  \n   w   g   e   t       h   t   t   p   :   /   /

0000400   /  \n
0000402
root@Ubuntu14:/home/abc12/Desktop# sh -x script.sh.fixed 

3

Il comando seguente ha funzionato su Ubuntu 16.4

Questo problema si verifica quando il file .sh è danneggiato o non formattato secondo i protocolli unix.

dos2unix converte il file .sh in formato Unix!

sudo apt-get install dos2unix -y
dos2unix test.sh
sudo chmod u+x test.sh 
sudo ./test.sh

1

Ho avuto lo stesso problema con un file che ho creato sul mio Mac. Se provo a eseguirlo in una shell con ./filename ho ricevuto il messaggio di errore file non trovato. Penso che qualcosa non andasse nel file.

quello che ho fatto:

apri una sessione ssh sul server
cat nome file
copia l'output negli appunti
rm nome file
tocca nome file
vi nome file
i per la modalità di inserimento
incolla il contenuto dagli appunti
ESC per terminare la modalità di inserimento
: wq!

Questo ha funzionato per me.


1

Ho appena avuto questo problema mingw32 bash. Avevo eseguito node / npm da Program Files (x86)\nodejse poi li avevo spostati nella disableddirectory (essenzialmente rimuovendoli dal percorso). Avevo anche Program Files\nodejs(cioè la versione a 64 bit) nel percorso, ma solo dopo la versione x86. Dopo aver riavviato la shell bash, è possibile trovare la versione a 64 bit di npm. nodeha funzionato correttamente tutto il tempo (controllato con node -vquello cambiato quando è stata spostata la versione x86).

Penso che bash -ravrebbe funzionato invece di riavviare bash: https://unix.stackexchange.com/a/5610


1

Come accennato da altri, questo perché il caricatore non può essere trovato, non il tuo file eseguibile. Purtroppo il messaggio non è abbastanza chiaro.

Puoi risolverlo cambiando il caricatore utilizzato dal tuo eseguibile, vedi la mia risposta completa in quest'altra domanda: più librerie glibc su un singolo host

Fondamentalmente devi trovare quale caricatore sta cercando di utilizzare:

$ readelf -l arm-mingw32ce-g++ | grep interpreter
  [Requesting program interpreter: /lib/ld-linux.so.2]

Quindi trova il percorso giusto per un caricatore equivalente e modifica il tuo eseguibile per utilizzare il caricatore dal percorso che è realmente:

$ ./patchelf --set-interpreter /path/to/newglibc/ld-linux.so.2 arm-mingw32ce-g++

Probabilmente dovrai anche impostare il percorso degli include, saprai se lo vuoi o no dopo aver provato ad eseguirlo. Vedi tutti i dettagli in quell'altro thread.


1

Ho trovato la mia soluzione per il mio Ubuntu 18 qui .

sudo dpkg --add-architecture i386

Poi:

sudo apt-get update
sudo apt-get install libc6:i386 libncurses5:i386 libstdc++6:i386

0

Ho avuto questo problema e il motivo era EOL in alcuni editor come Notepad ++. Puoi controllarlo nel menu Modifica / Conversione EOL. Unix (LF) dovrebbe essere selezionato. Spero possa essere utile.


È improbabile che questo sia il problema in questo caso, poiché il comando non viene eseguito da un file.
— RalfFriedl

0

Aggiunto qui per riferimento futuro (per utenti che potrebbero cadere nello stesso caso): questo errore si verifica quando si lavora su Windows (che introduce caratteri extra a causa del separatore di riga diverso rispetto al sistema Linux) e si tenta di eseguire questo script (con caratteri extra inseriti) in Linux. Il messaggio di errore è fuorviante.

In Windows, il separatore di riga è CRLF ( \ r \ n ) mentre in Linux è LF ( \ n ). Questo di solito può essere scelto nell'editor di testo.

Nel mio caso, ciò è accaduto a causa del lavoro su Windows e del caricamento sul server Unix per l'esecuzione.


1
Uso docker, linux, ma lo costruisco da Windows. Il mio script è iniziato scriptdir=$(cd "$( dirname "${BASH_SOURCE[0]}" )" && pwd)quindi cd $scriptdir || exit 1ma il \rfile modificato da Windows è stato aggiunto al scriptdirvalore. Quindi il messaggio è : no such file or directorystato molto confuso, dal momento che ha finito per cancellare ciò di cui si lamentava.
— Jesse Chisholm,
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.