Ce type de message est généralement dû à une fausse ligne shebang, à un retour de chariot supplémentaire à la fin de la première ligne ou à une nomenclature au début de celle-ci.
Courir:
$ head -1 yourscript | od -c
et voir comment ça se termine.
C'est faux:
0000000 # ! / b i n / b a s h \r \n
C'est faux aussi:
0000000 357 273 277 # ! / b i n / b a s h \n
C'est correct:
0000000 # ! / b i n / b a s h \n
Utilisez dos2unix
(ou sed
, tr
, awk
, perl
, python
...) pour corriger votre script si tel est le problème.
En voici un qui supprimera à la fois une CR et une liste de contrôle:
sed -i '1s/^.*#//;s/\r$//' brokenScript
Notez que le shell que vous utilisez pour exécuter le script affectera légèrement les messages d'erreur affichés.
Voici trois scripts montrant simplement leur nom ( echo $0
) et comportant les lignes shebang respectives suivantes:
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
Sous bash, leur exécution montrera ces messages:
$ ./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
Exécuter les faux en appelant explicitement l'interpréteur permet au script CRLF de s'exécuter sans problème:
$ bash ./scriptWithCRLF
./scriptWithCRLF
$ bash ./scriptWithBom
./scriptWithBom: line 1: #!/bin/bash: No such file or directory
./scriptWithBom
Voici le comportement observé sous ksh
:
$ ./scriptWithCRLF
ksh: ./scriptWithCRLF: not found [No such file or directory]
$ ./scriptWithBom
./scriptWithBom[1]: #!/bin/bash: not found [No such file or directory]
./scriptWithBom
et sous dash
:
$ ./scriptWithCRLF
dash: 2: ./scriptWithCRLF: not found
$ ./scriptWithBom
./scriptWithBom: 1: ./scriptWithBom: #!/bin/bash: not found
./scriptWithBom