#! / bin / bash - esse arquivo ou diretório não existe

70

Eu criei um script bash, mas quando tento executá-lo, recebo

#!/bin/bash no such file or directory

Eu preciso executar o comando: bash script.shpara que ele funcione.

Como posso consertar isso?

Nicolas de Fontenay
fonte
Eu tenho esse problema agora no cygwin com um script que eu poderia jurar que já estava sendo executado sem problemas. Eu verifiquei todas as respostas, mas nenhuma parece se encaixar. Outras perguntas e respostas também mencionaram problemas de 32/64 bits, mas para scripts de shell isso pode ser excluído, certo?
janeiro
Encontrou a razão, acrescentou detalhes em nova anwer unix.stackexchange.com/a/450389/62636 no caso de alguém também usou #!/usr/bin/env bashem vez de #!/bin/bashe também à procura aqui ...
janeiro

Respostas:

100

Esse tipo de mensagem geralmente ocorre devido a uma linha falsa, como um retorno de carro extra no final da primeira linha ou uma lista técnica no início.

Corre:

$ head -1 yourscript | od -c

e veja como termina.

Isto está errado:

0000000   #   !   /   b   i   n   /   b   a   s   h  \r  \n

Isso também está errado:

0000000 357 273 277   #   !   /   b   i   n   /   b   a   s   h  \n

Isto está correto:

0000000   #   !   /   b   i   n   /   b   a   s   h  \n

Use dos2unix(ou sed, tr, awk, perl, python...) para corrigir o seu script se esta é a questão.

Aqui está um que removerá os CRs de lista técnica e de cauda:

sed -i '1s/^.*#//;s/\r$//' brokenScript


Observe que o shell que você está usando para executar o script afetará levemente as mensagens de erro exibidas.

Aqui estão três scripts que mostram apenas o nome ( echo $0) e as seguintes linhas de shebang:

correctScript:

0000000   #   !   /   b   i   n   /   b   a   s   h  \n

scriptWithBom:

0000000 357 273 277   #   !   /   b   i   n   /   b   a   s   h  \n

scriptWithCRLF:

0000000   #   !   /   b   i   n   /   b   a   s   h  \r  \n

Sob bash, executá-los mostrará estas mensagens:

$ ./correctScript
./correctScript
$ ./scriptWithCRLF
bash: ./scriptWithCRLF: /bin/bash^M: bad interpreter: No such file or directory
$ ./scriptWithBom
./scriptWithBom: line 1: #!/bin/bash: No such file or directory
./scriptWithBom

Executar os falsos chamando explicitamente o intérprete permite que o script CRLF seja executado sem nenhum problema:

$ bash ./scriptWithCRLF
./scriptWithCRLF
$ bash ./scriptWithBom
./scriptWithBom: line 1: #!/bin/bash: No such file or directory
./scriptWithBom

Aqui está o comportamento observado em ksh:

$ ./scriptWithCRLF
ksh: ./scriptWithCRLF: not found [No such file or directory]
$ ./scriptWithBom
./scriptWithBom[1]: #!/bin/bash: not found [No such file or directory]
./scriptWithBom

e abaixo dash:

$ ./scriptWithCRLF
dash: 2: ./scriptWithCRLF: not found
$ ./scriptWithBom
./scriptWithBom: 1: ./scriptWithBom: #!/bin/bash: not found
./scriptWithBom
jlliagre
fonte
2
Outra maneira de revelar se esse é o problema é hexdump -C yourscript | head -n 1. Eu ainda usaria dos2unix yourscriptpara consertar isso.
Kevin M
Sim, poderia muito bem ser isso. Eu editei no windows. Coisas para a dica.
Nicolas de Fontenay
11
Se fosse um problema CRLF, você não veria uma #!/bin/bash no such file or directorymensagem de erro, pois não há motivo para tentar executar ou abrir #!/bin/bash. É o /bin/bash<CR>que seria executado.
Stéphane Chazelas
11
@StephaneChazelas Como o dos2unix resolveu o problema, há poucas dúvidas de que não era um problema do CRLF. A mensagem de erro foi provavelmente apenas imprecisamente transcritas ..
jlliagre
6
dos2unixtambém remove uma lista técnica UTF-8. Uma lista técnica UTF-8 poderia ter explicado a mensagem de erro.
Stéphane Chazelas
17

Isso também pode ser causado por uma lista técnica em um script UTF-8. Se você criar o script no Windows, às vezes você recebe algum lixo no início do arquivo.

teknopaul
fonte
BOM pode ser facilmente removido usando awk, como em stackoverflow.com/questions/1068650/...
pauxu
11
Observe que o Visual Studio para Mac irá inserir uma lista técnica.
Clearer
9

Na verdade, o shebang certo para o script bash é o seguinte:

#!/usr/bin/env bash

Porque, no freeBSD, o bash está localizado em /usr/local/bin/bash

moebius_eye
fonte
13
"certo" é uma palavra difícil de usar nesses casos. Talvez uma frase melhor seja "menos propensa a erros".
HalosGhost
11
Isso também é terrível; a suposição de que / usr existe é uma IMO ruim. O Haiku, por exemplo, não possui / usr.
Jessicah
9

Você pode usar o vi para corrigir os dois problemas, se eles existirem:

vi <your_file>
:set ff=unix
:set nobomb
:wq
cwash
fonte
As respostas devem ser independentes, tanto quanto possível. A questão não menciona dois problemas; se você quiser desenvolver outras respostas, diga pelo menos o que elas são. Melhor ainda, você deve explicar como isso responde à pergunta.
G-Man
Correção muito rápida sem baixar mais ferramentas do Windows, obrigado!
steampowered
11
@ G-Man Outras respostas já mencionam isso com muito mais detalhes do que gostaria de entrar. Não é necessário repetir, mas se não for dolorosamente óbvio, você pode ter uma linha do Windows terminada e um caractere oculto da BOM do Windows. Eu acho que muitas pessoas que estão digitalizando respostas apreciam a brevidade em vez de serem independentes, especialmente quando há muito mais detalhes em outras respostas.
Cwash
4

Se você não possui o dos2unix, é uma maneira de corrigir esse problema.

cp script _p4 && tr -d '\r' < _p4 > script && rm _p4
cokeude
fonte
3

Marca de ordem de bytes (BOM)

Isso pode ser causado por uma lista técnica. Na Wikipedia, uma BOM é uma

A marca de ordem de byte (BOM) é um caractere Unicode, marca de ordem de byte U + FEFF (BOM), cuja aparência como um número mágico no início de um fluxo de texto pode sinalizar várias coisas para um programa que consome o texto

Infelizmente, não sinaliza nada para o kernel do Linux que lida com a linha she-bang. Você pode verificar se possui uma lista técnica usando file,

file /tmp/foo 
/tmp/foo: UTF-8 Unicode (with BOM) text

Ou você pode fazer o hexadump dos primeiros caracteres e verificar se eles correspondem a algum dos caracteres da lista técnica manualmente.

Você pode retirar os caracteres da lista técnica depois de conhecê-los assim,

sed -i '1 s/^\xef\xbb\xbf//' *.txt
Fabien Haddadi
fonte
0

Eu tive o problema ao adicionar acidentalmente um executável bash errado ao arquivo PATHe porque no meu script o #!/usr/bin/env bashshebang mais flexível foi usado (pegue o primeiro executável do bash no caminho).

command -v bash
/cygdrive/c/Program Files/Git/bin//bash

Instalei o GIT for Windows para trabalhar em cygwinconjunto com as GUIs do Windows GIT (não estava funcionando com o git nativo do cygwin ...). #!/bin/bashResolvi isso agora, mudando para sheband e removendo o GIT para Windows PATH.

jan
fonte
-3

Experimentar #!/bin/bash

Segunda coisa: find / -name bash
Terceira coisa:ls -al /bin/bash

Sebastian Szary
fonte
Ou apenas which bash. Sabemos que está encontrando um porque está trabalhando bash script.sh.
Kevin
Verdadeiro. E, como mencionado, existe o método muito mais portátil / usr / bin / env para que um programa localize o bash (ou outro intérprete) para você. Não há necessidade de codificar um pah.
Hennes