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