Este dilema se puede abordar de variadas maneras, pero te compartimos la solución más completa para nosotros.
Este tipo de mensaje generalmente se debe a una línea de shebang falsa, ya sea un retorno de carro adicional al final de la primera línea o una lista de materiales al principio.
Correr:
$ head -1 yourscript | od -c
y ver como 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
Usar dos2unix
(o sed
, tr
, awk
, perl
, python
…) para arreglar su script si este es el problema.
Aquí hay uno que eliminará tanto una lista de materiales como CR de seguimiento:
sed -i '1s/^.*#//;s/r$//' brokenScript
Tenga en cuenta que el shell que está utilizando para ejecutar el script afectará ligeramente los mensajes de error que se muestran.
Aquí hay tres guiones que solo muestran su nombre (echo $0
) y teniendo las siguientes líneas shebang respectivas:
guión correcto:
0000000 # ! / b i n / b a s h n
guionConBom:
0000000 357 273 277 # ! / b i n / b a s h n
scriptConCRLF:
0000000 # ! / b i n / b a s h r n
Bajo 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
Esto también puede deberse a una lista de materiales en un script UTF-8. Si crea el script en Windows, a veces obtiene algo de basura al comienzo del archivo.
En realidad, el shebang correcto para bash script es este:
#!/usr/bin/env bash
Porque, en freeBSD, bash se encuentra en /usr/local/bin/bash