Questo tipo di messaggio è generalmente dovuto a una falsa riga shebang, o un ritorno a capo extra alla fine della prima riga o una distinta base all'inizio di essa.
Correre:
$ head -1 yourscript | od -c
e guarda come finisce.
Questo è sbagliato:
0000000 # ! / b i n / b a s h \r \n
Anche questo è sbagliato:
0000000 357 273 277 # ! / b i n / b a s h \n
Questo è corretto:
0000000 # ! / b i n / b a s h \n
Utilizzare dos2unix
(o sed
, tr
, awk
, perl
, python
...) per risolvere il tuo script, se questo è il problema.
Eccone uno che rimuoverà sia una DBA che i CR di coda:
sed -i '1s/^.*#//;s/\r$//' brokenScript
Si noti che la shell che si sta utilizzando per eseguire lo script influirà leggermente sui messaggi di errore visualizzati.
Ecco tre script che mostrano solo il loro nome ( echo $0
) e hanno le seguenti rispettive righe di 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
Sotto bash, eseguendoli verranno mostrati questi messaggi:
$ ./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
L'esecuzione di quelli falsi chiamando esplicitamente l'interprete consente l'esecuzione dello script CRLF senza alcun problema:
$ bash ./scriptWithCRLF
./scriptWithCRLF
$ bash ./scriptWithBom
./scriptWithBom: line 1: #!/bin/bash: No such file or directory
./scriptWithBom
Ecco il comportamento osservato sotto 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 sotto dash
:
$ ./scriptWithCRLF
dash: 2: ./scriptWithCRLF: not found
$ ./scriptWithBom
./scriptWithBom: 1: ./scriptWithBom: #!/bin/bash: not found
./scriptWithBom