J'ai créé un script bash mais quand j'essaye de l'exécuter, j'obtiens
#!/bin/bash no such file or directory
J'ai besoin d'exécuter la commande: bash script.sh
pour que cela fonctionne.
Comment puis-je réparer cela?
Ce type de message est généralement dû à une ligne de Shebang bidon, soit un retour chariot supplémentaire à la fin de la première ligne, soit une nomenclature au début de celle-ci.
Courir:
$ head -1 yourscript | od -c
et voyez 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
Utilisation dos2unix
(ou sed
, tr
, awk
, Perl
, python
…) pour corriger votre script si tel est le problème.
En voici un qui supprimera à la fois la nomenclature et les CR de queue:
sed -i '1s/^.*#//;s/\r$//' brokenScript
Voici trois scripts montrant simplement leur nom (echo $0
) et ayant 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, les exécuter affichera 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
L'exécution des faux en appelant explicitement l'interpréteur permet au script CRLF de s'exécuter sans aucun 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
Cela peut également être dû à une nomenclature dans un script UTF-8. Si vous créez le script dans Windows, vous obtenez parfois des fichiers indésirables au début du fichier.
Vous pouvez utiliser vi pour résoudre les deux problèmes s'ils existent:
vi <your_file>
:set ff=unix
:set nobomb
:wq
En fait, le bon Shebang pour le script bash est le suivant:
#!/usr/bin/env bash
Parce que, dans freeBSD, bash est situé dans /usr/local/bin/bash
Si vous n'avez pas dos2unix, c'est un moyen de résoudre ce problème.
cp script _p4 && tr -d '\r' < _p4 > script && rm _p4
Cela peut être dû à une nomenclature. D'après Wikipédia, une nomenclature est un
La marque d'ordre des octets (BOM) est un caractère Unicode, marque d'ordre des octets U + FEFF (BOM), dont l'apparition en tant que nombre magique au début d'un flux de texte peut signaler plusieurs choses à un programme consommant le texte.
Malheureusement, cela ne signale rien au noyau Linux qui gère la ligne she-bang. Vous pouvez vérifier que vous avez une nomenclature en utilisant file
,
file /tmp/foo
/tmp/foo: UTF-8 Unicode (with BOM) text
Ou vous pouvez hexdump les premiers caractères et voir s'ils correspondent manuellement à l'un des caractères de la nomenclature
Vous pouvez supprimer les caractères de la nomenclature une fois que vous les connaissez comme ça,
sed -i '1 s/^\xef\xbb\xbf//' *.txt
J'ai eu le problème en ajoutant accidentellement un mauvais exécutable bash au PATH
et parce que dans mon script le plus flexible #!/usr/bin/env bash
Shebang a été utilisé (prendre le premier exécutable bash du chemin).
command -v bash
/cygdrive/c/Program Files/Git/bin//bash
J'ai installé GIT pour Windows pour travailler dans cygwin
avec les interfaces graphiques Windows GIT (ne fonctionnait pas avec cygwin native git ...). J'ai résolu cela maintenant en passant à #!/bin/bash
sheband et suppression de GIT pour windows de PATH
.