"No existe tal archivo o directorio" pero existe

93

Simplemente quiero ejecutar un ejecutable desde la línea de comando ./arm-mingw32ce-g++, pero luego aparece el mensaje de error,

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

Estoy ejecutando Ubuntu Linux 10.10. ls -lliza

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

El uso de sudo ( sudo ./arm-mingw32ce-g++) da

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

No tengo idea de por qué el sistema operativo ni siquiera puede ver el archivo cuando está allí. ¿Alguna idea?

Warpspace
fuente

Respuestas:

82

Este error puede significar que ./arm-mingw32ce-g++no existe (pero sí), o que existe y es un ejecutable vinculado dinámicamente reconocido por el kernel pero cuyo cargador dinámico no está disponible. Puede ver qué cargador dinámico se requiere ejecutando ldd /arm-mingw32ce-g++; todo lo marcado not foundes el cargador dinámico o una biblioteca que necesita instalar.

Si está intentando ejecutar un binario de 32 bits en una instalación amd64:

Gilles 'SO- deja de ser malvado'
fuente
16
¡Impresionante, funciona! Por cierto, la salida de ldd fue not a dynamic executable(antes de instalar ia32-libs).
Warpspace
3
ia32-libs-*está en desuso en Ubuntu 16.04, instale lib32ncurses5y en su lib32z1lugar.
GaloisPlusPlus
2
Este es un problema común en Nix o NixOS cuando se intenta ejecutar binarios de terceros; ver patchelf.
bbarker
29

Me enfrenté a este error cuando intentaba compilar la fuente de Selenium en Ubuntu. El script de shell simple con shebang correcto no se pudo ejecutar incluso después de haber cubierto todos los requisitos previos.

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

Abrí el archivo en Vim y pude ver que solo porque una vez edité este archivo en una máquina con Windows, estaba en formato DOS. Convertí el archivo a formato Unix con el siguiente comando:

dos2unix filename # actually helped me and things were fine.

Espero que tengamos cuidado cada vez que editamos archivos en plataformas, también debemos cuidar los formatos de archivo.

h3xh4wk
fuente
¡Funcionó! después de probar varias cosas, esta fue la solución. ¡Gracias!
Pedro Perez
20

Este error también puede ocurrir si intenta ejecutar una secuencia de comandos y el shebang está mal escrito. Asegúrese de que lea #!/bin/sh, #!/bin/basho el intérprete que esté utilizando.

Zoltán
fuente
4
Me refiero a un ejecutable, no a un script. Por otra parte, otra persona puede encontrar útil este comentario
Warpspace
1
Es cierto, pero llegué a esta pregunta para este problema exacto, así que, como dijiste, tal vez alguien más también lo haga.
Zoltán
En mi caso, estaba tratando de correr en ./my/full/path/myscriptlugar de ./myscript.
Noumenon
8

Tuve el mismo mensaje de error al intentar ejecutar un script de Python; este no era el caso de uso previsto de @ Warpspace (ver otros comentarios), pero este fue uno de los principales resultados de mi búsqueda, por lo que tal vez alguien lo encuentre útil.

En mi caso, fueron las terminaciones de línea de DOS (en \r\nlugar de \n) con las que tropezaría la línea shebang ( #!/usr/bin/env python). Un simple lo dos2unix myfile.pyarregló.

djlauk
fuente
4

Recibí el mismo error para un script bash simple que no tendría problemas de 32/64 bits. Esto posiblemente se deba a que el script que está intentando ejecutar tiene un error. Esta publicación del foro de ubuntu indica que con archivos de script normales puede agregar 'sh' al frente y es posible que obtenga algunos resultados de depuración. p.ej

$ sudo sh arm-mingw32ce-g++

y vea si obtiene algún resultado.

En mi caso, el problema real era que el archivo que intentaba ejecutar estaba en formato Windows en lugar de Linux.

icc97
fuente
3

Recibí este error “No such file or directory”pero existe porque mi archivo fue creado en Windows e intenté ejecutarlo en Ubuntu y el archivo contenía 15 \ r inválidos donde alguna vez había una nueva línea allí. Acabo de crear un archivo nuevo que trunca las cosas no deseadas.

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 
Pan
fuente
3

El siguiente comando funcionó en Ubuntu 16.4

Este problema surge cuando su archivo .sh está dañado o no está formateado según los protocolos de Unix.

¡dos2unix convierte el archivo .sh a formato Unix!

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

Tuve el mismo problema con un archivo que creé en mi mac. Si trato de ejecutarlo en un shell con ./filename, obtengo el mensaje de error de archivo no encontrado. Creo que algo andaba mal con el archivo.

qué he hecho:

abrir una sesión ssh en el servidor
cat nombre de archivo
copie la salida en el portapapeles
rm nombre de archivo
toque nombre de archivo
vi nombre de archivo
i para el modo de inserción
pegue el contenido del portapapeles
ESC para finalizar el modo de inserción
: wq!

Esto funcionó para mí.

espacio
fuente
1

Acabo de tener este problema en mingw32 bash. Había ejecutado node / npm desde Program Files (x86)\nodejsy luego los moví al disableddirectorio (esencialmente eliminándolos de la ruta). También tenía Program Files\nodejs(es decir, la versión de 64 bits) en la ruta, pero solo después de la versión x86. Después de reiniciar el shell bash, se pudo encontrar la versión de 64 bits de npm. nodefuncionó correctamente todo el tiempo (comprobado node -vque cambió cuando se movió la versión x86).

Creo que bash -rhabría funcionado en lugar de reiniciar bash: https://unix.stackexchange.com/a/5610

Pasi Savolainen
fuente
1

Como han mencionado otros, esto se debe a que no se puede encontrar el cargador, no su archivo ejecutable. Desafortunadamente, el mensaje no es lo suficientemente claro.

Puede solucionarlo cambiando el cargador que usa su ejecutable, vea mi respuesta completa en esta otra pregunta: Varias bibliotecas glibc en un solo host

Básicamente, debe encontrar qué cargador está tratando de usar:

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

Luego encuentre la ruta correcta para un cargador equivalente y cambie su ejecutable para usar el cargador de la ruta que realmente es:

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

Probablemente también necesitará establecer la ruta de las inclusiones, sabrá si lo desea o no después de intentar ejecutarlo. Vea todos los detalles en ese otro hilo.

msb
fuente
1

Encontré mi solución para mi Ubuntu 18 aquí .

sudo dpkg --add-architecture i386

Entonces:

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

Tuve este problema y la razón fue EOL en algunos editores como Notepad ++. Puede comprobarlo en el menú Editar / Conversión EOL. Debe seleccionarse Unix (LF). Espero que te sea de utilidad.

user3184564
fuente
Es poco probable que ese sea el problema en este caso, ya que el comando no se ejecuta desde un archivo.
RalfFriedl
0

Agregado aquí para referencia futura (para usuarios que podrían caer en el mismo caso): este error ocurre cuando se trabaja en Windows (que introduce caracteres adicionales debido a un separador de línea diferente al del sistema Linux) y se intenta ejecutar este script (con caracteres adicionales insertados) en Linux. El mensaje de error es engañoso.

En Windows, el separador de línea es CRLF ( \ r \ n ) mientras que en Linux es LF ( \ n ). Por lo general, esto se puede elegir en el editor de texto.

En mi caso, esto sucedió debido a trabajar en Windows y subirlo al servidor Unix para su ejecución.

PALEN
fuente
1
Yo uso Docker, Linux, pero lo construyo desde Windows. Mi secuencia de comandos comenzó scriptdir=$(cd "$( dirname "${BASH_SOURCE[0]}" )" && pwd)entonces, cd $scriptdir || exit 1pero \ren mi archivo editado por Windows se agregó al scriptdirvalor. Entonces el mensaje : no such file or directoryfue más confuso, ya que terminó borrando de qué se estaba quejando.
Jesse Chisholm