Este tipo de mensaje generalmente se debe a una línea shebang falsa, ya sea un retorno de carro adicional al final de la primera línea o una lista de materiales al comienzo de la misma.
Correr:
$ head -1 yourscript | od -c
y mira cómo termina.
Esto está mal:
0000000 # ! / b i n / b a s h \r \n
Esto también está mal:
0000000 357 273 277 # ! / b i n / b a s h \n
Esto es correcto:
0000000 # ! / b i n / b a s h \n
Utilizar dos2unix
(o sed
, tr
, awk
, perl
, python
...) para fijar la secuencia de comandos si este es el problema.
Aquí hay uno que eliminará tanto una lista de materiales como las CR de colas:
sed -i '1s/^.*#//;s/\r$//' brokenScript
Tenga en cuenta que el shell que está utilizando para ejecutar el script afectará levemente los mensajes de error que se muestran.
Aquí hay tres scripts que solo muestran su nombre ( echo $0
) y tienen las siguientes líneas shebang respectivas:
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
En bash, ejecutarlos mostrará estos mensajes:
$ ./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
Ejecutar los falsos llamando explícitamente al intérprete permite que el script CRLF se ejecute sin ningún problema:
$ bash ./scriptWithCRLF
./scriptWithCRLF
$ bash ./scriptWithBom
./scriptWithBom: line 1: #!/bin/bash: No such file or directory
./scriptWithBom
Aquí está el comportamiento observado bajo ksh
:
$ ./scriptWithCRLF
ksh: ./scriptWithCRLF: not found [No such file or directory]
$ ./scriptWithBom
./scriptWithBom[1]: #!/bin/bash: not found [No such file or directory]
./scriptWithBom
y debajo dash
:
$ ./scriptWithCRLF
dash: 2: ./scriptWithCRLF: not found
$ ./scriptWithBom
./scriptWithBom: 1: ./scriptWithBom: #!/bin/bash: not found
./scriptWithBom