web-dev-qa-db-fra.com

#! / bin / bash - aucun fichier ou répertoire de ce type

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?

76
Nicolas de Fontenay

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
108
jlliagre

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.

17
teknopaul

Vous pouvez utiliser vi pour résoudre les deux problèmes s'ils existent:

vi <your_file>
:set ff=unix
:set nobomb
:wq
10
cwash

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

10
moebius_eye

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
4
cokedude

Marque d'ordre des octets (BOM)

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
3
Fabien Haddadi

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.

0
jan