“Esse arquivo ou diretório não existe”, mas existe


95

Eu simplesmente quero executar um executável da linha de comando ./arm-mingw32ce-g++, mas recebo a mensagem de erro,

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

Estou executando o Ubuntu Linux 10.10. ls -llistas

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

Usar sudo ( sudo ./arm-mingw32ce-g++) dá

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

Não tenho ideia de por que o sistema operacional nem consegue ver o arquivo quando ele está lá. Alguma ideia?

Respostas:


82

Esse erro pode significar que ./arm-mingw32ce-g++não existe (mas existe) ou que existe e é um executável vinculado dinamicamente reconhecido pelo kernel, mas cujo carregador dinâmico não está disponível. Você pode ver qual carregador dinâmico é necessário executando ldd /arm-mingw32ce-g++; qualquer coisa marcada not foundé o carregador dinâmico ou uma biblioteca que você precisa instalar.

Se você estiver tentando executar um binário de 32 bits em uma instalação amd64:


16
Incrível, funciona! A propósito, a saída do ldd era not a dynamic executable(antes de instalar o ia32-libs).
Warpspace

3
ia32-libs-*está obsoleto no Ubuntu 16.04, instale lib32ncurses5e em seu lib32z1lugar.
GaloisPlusPlus

2
Este é um problema comum no Nix ou NixOS ao tentar executar binários de terceiros; veja patchelf.
bbarker

32

Eu enfrentei esse erro quando estava tentando construir o código-fonte Selenium no Ubuntu. O script de shell simples com o shebang correto não foi capaz de ser executado mesmo depois de eu ter atendido todos os pré-requisitos.

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

Abri o arquivo no Vim e pude ver que só porque uma vez editei esse arquivo em uma máquina Windows, ele estava no formato DOS. Converti o arquivo para o formato Unix com o comando abaixo:

dos2unix filename # actually helped me and things were fine.

Espero que tenhamos cuidado sempre que editarmos arquivos em plataformas, devemos tomar cuidado com os formatos de arquivo também.


Funcionou! depois de tentar várias coisas, esta foi a solução. Obrigado!
Pedro Perez

Uma década atrasada, mas o crédito é devido. No meu caso, usando WSL2 no windows com diretórios do windows montados dentro da distro rodando em WSL. Extremidades de linha do Windows - arquivos unix.
Brenton Thomas

Obrigado, @BrentonThomas. Estou feliz por ter ajudado. Ainda não experimentei WSL no Windows. Desejo usá-lo em breve.
h3xh4wk

20

Este erro também pode ocorrer se tentar executar um script e o shebang estiver incorreto. Certifique-se de que lê #!/bin/sh, #!/bin/bashou o intérprete que você está usando.


4
Estou me referindo a um executável, não a um script. Então, outra pessoa pode achar este comentário útil
Warpspace

1
É verdade, mas me deparei com essa pergunta exatamente por causa desse problema, então, como você disse, talvez outra pessoa o faça também.
Zoltán

No meu caso, eu estava tentando correr em ./my/full/path/myscriptvez de ./myscript.
Noumenon

8

Eu recebi a mesma mensagem de erro ao tentar executar um script Python - este não era o caso de uso pretendido do @Warpspace (veja outros comentários), mas estava entre os principais resultados da minha pesquisa, então talvez alguém ache útil.

No meu caso, eram as terminações de linha DOS (em \r\nvez de \n) que a linha shebang ( #!/usr/bin/env python) tropeçava . Um simples dos2unix myfile.pyconsertou.


4

Recebi o mesmo erro para um script bash simples que não teria problemas de 32/64 bits. Isso ocorre possivelmente porque o script que você está tentando executar contém um erro. Esta postagem no fórum do Ubuntu indica que, com arquivos de script normais, você pode adicionar 'sh' na frente e pode obter alguma saída de depuração dele. por exemplo

$ sudo sh arm-mingw32ce-g++

e veja se você consegue alguma saída.

No meu caso, o problema real era que o arquivo que eu estava tentando executar estava no formato Windows em vez de Linux.


3

Recebi este erro, “No such file or directory”mas ele existe porque meu arquivo foi criado no Windows e tentei executá-lo no Ubuntu e o arquivo continha 15 \ r inválido onde sempre havia uma nova linha. Acabei de criar um novo arquivo truncando coisas indesejadas

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

O comando abaixo funcionou em 16.4 Ubuntu

Este problema surge quando o seu arquivo .sh está corrompido ou não formatado de acordo com os protocolos Unix.

dos2unix converte o arquivo .sh para o formato Unix!

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

1

Eu tive o mesmo problema com um arquivo que criei no meu mac. Se eu tentar executá-lo em um shell com ./filename, recebo a mensagem de erro arquivo não encontrado. Acho que algo estava errado com o arquivo.

o que eu fiz:

abrir uma sessão ssh para o servidor
cat nome do arquivo
copiar a saída para a área de transferência
rm nome do arquivo
toque nome do arquivo
vi nome do arquivo
i para o modo de inserção
cole o conteúdo da área de transferência
ESC para encerrar o modo de inserção
: wq!

Isso funcionou para mim.


1

Acabei de ter esse problema em mingw32 bash. Eu tinha executado node / npm de Program Files (x86)\nodejse, em seguida, movido para o disableddiretório (essencialmente removendo-os do caminho). Eu também tinha Program Files\nodejs(ou seja, versão de 64 bits) no caminho, mas apenas após a versão x86. Depois de reiniciar o shell bash, a versão de 64 bits do npm pode ser encontrada. nodefuncionou corretamente o tempo todo (verificado com node -va mudança quando a versão x86 foi movida).

Acho que bash -rteria funcionado em vez de reiniciar o bash: https://unix.stackexchange.com/a/5610


1

Conforme mencionado por outros, isso ocorre porque o carregador não pode ser encontrado, e não o seu arquivo executável. Infelizmente, a mensagem não é suficientemente clara.

Você pode consertar alterando o carregador que seu executável usa, veja minha resposta completa nesta outra pergunta: Várias bibliotecas glibc em um único host

Basicamente, você deve encontrar qual carregador ele está tentando usar:

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

Em seguida, encontre o caminho certo para um carregador equivalente e altere seu executável para usar o carregador do caminho que ele realmente é:

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

Você provavelmente precisará definir o caminho dos includes também, você saberá se deseja ou não depois de tentar executá-lo. Veja todos os detalhes nesse outro tópico.


1

Eu encontrei minha solução para meu Ubuntu 18 aqui .

sudo dpkg --add-architecture i386

Então:

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

0

Eu tive esse problema e o motivo era EOL em alguns editores como o Notepad ++. Você pode verificar isso no menu Editar / conversão EOL. Unix (LF) deve ser selecionado. Espero que seja útil.


É improvável que esse seja o problema neste caso, pois o comando não é executado a partir de um arquivo.
RalfFriedl,

0

Adicionado aqui para referência futura (para usuários que podem cair no mesmo caso): Este erro ocorre ao trabalhar no Windows (que introduz caracteres extras devido ao separador de linha diferente do sistema Linux) e ao tentar executar este script (com caracteres extras inseridos) no Linux. A mensagem de erro é enganosa.

No Windows, o separador de linha é CRLF ( \ r \ n ), enquanto no Linux é LF ( \ n ). Isso geralmente pode ser escolhido no editor de texto.

No meu caso, isso aconteceu devido a trabalhar no Windows e fazer o upload para o servidor Unix para execução.


1
Eu uso docker, linux, mas construo a partir do Windows. Meu script foi iniciado scriptdir=$(cd "$( dirname "${BASH_SOURCE[0]}" )" && pwd)então, cd $scriptdir || exit 1mas \rno arquivo editado no meu Windows foi anexado ao scriptdirvalor. Então a mensagem : no such file or directoryficou mais confusa, pois acabou apagando o que estava reclamando.
Jesse Chisholm

0

Acerte este erro ao tentar executar o terraform / terragrunt (binário único go).

Usando which terragruntpara encontrar onde estava o executável, obteve um erro estranho ao executá-lo no diretório local ou com o caminho completo

bash: ./terragrunt: No such file or directory

O problema era que havia duas instalações do terragrunt, usado brew uninstall terragruntpara remover um corrigido.

Depois de retirar o um, which terragruntmostrou o novo caminho /usr/bin/terragrunttudo funcionou bem.

Ao utilizar nosso site, você reconhece que leu e compreendeu nossa Política de Cookies e nossa Política de Privacidade.
Licensed under cc by-sa 3.0 with attribution required.