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

70

J'ai créé un script bash mais quand j'essaye de l'exécuter, je reçois

#!/bin/bash no such file or directory

Je dois exécuter la commande: bash script.shpour que cela fonctionne.

Comment puis-je réparer cela?

Nicolas de Fontenay
la source
J'ai ce problème maintenant sous cygwin avec un script que je pourrais jurer fonctionnait déjà sans problèmes. J'ai vérifié toutes les réponses, mais aucune ne semble correspondre. D'autres questions et réponses ont également mentionné des problèmes 32/64 bits, mais cela pourrait être exclu pour les scripts shell, n'est-ce pas?
jan
Trouvez la raison, ajoutez des détails dans la nouvelle réponse unix.stackexchange.com/a/450389/62636 au cas où quelqu'un aurait également utilisé #!/usr/bin/env bashau lieu de #!/bin/bashet également en regardant ici ...
jan

Réponses:

100

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
jlliagre
la source
2
Une autre façon de révéler si tel est le problème est hexdump -C yourscript | head -n 1. Je voudrais toujours utiliser dos2unix yourscriptpour le réparer.
Kevin M
Oui, ça pourrait très bien être ça. J'ai édité dans Windows. Choses pour le pourboire.
Nicolas de Fontenay
1
S'il s'agissait d'un problème CRLF, aucun #!/bin/bash no such file or directorymessage d'erreur ne s'afficherait, car rien n'empêche que quelque chose tente de s'exécuter ou de s'ouvrir #!/bin/bash. C'est /bin/bash<CR>ce qui serait exécuté.
Stéphane Chazelas
1
@StephaneChazelas Comme dos2unix a résolu le problème, il ne fait aucun doute que ce n'était pas un problème de CRLF. Le message d'erreur est probablement inexactement .. transcrit
jlliagre
6
dos2unixsupprime également une nomenclature UTF-8. Une nomenclature UTF-8 aurait pu expliquer le message d'erreur.
Stéphane Chazelas
17

Cela peut également être causé par une nomenclature dans un script UTF-8. Si vous créez le script sous Windows, vous rencontrez parfois des problèmes au début du fichier.

teknopaul
la source
Vous pouvez supprimer facilement la nomenclature à l'aide de awk, comme dans stackoverflow.com/questions/1068650/…
pauxu
1
Notez que Visual Studio pour Mac insérera une nomenclature.
Clairière
9

En réalité, le bon message pour le script bash est le suivant:

#!/usr/bin/env bash

Parce que, dans freeBSD, bash est situé dans /usr/local/bin/bash

moebius_eye
la source
13
"droit" est un mot difficile à utiliser dans de tels cas. Peut-être qu'une meilleure phrase serait "moins sujette à l'erreur".
HalosGhost
1
C'est terrible aussi; l'hypothèse selon laquelle / usr existe est une mauvaise OMI. Haiku, par exemple, n'a pas / usr.
jessicah
9

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

vi <your_file>
:set ff=unix
:set nobomb
:wq
lavage
la source
Les réponses doivent être autant que possible autonomes. La question ne mentionne pas deux problèmes; si vous voulez vous appuyer sur d'autres réponses, vous devriez au moins dire ce qu'elles sont. Mieux encore, vous devriez expliquer comment cela répond à la question.
G-Man dit 'Réintégrez Monica'
Solution très rapide sans télécharger plus d'outils Windows, merci!
steampowered
1
@ G-Man D'autres réponses mentionnent déjà cela beaucoup plus en détail que ce que je souhaiterais aborder. Pas besoin de répéter, mais si ce n’est pas douloureusement évident, vous pouvez avoir une fin de ligne Windows et un caractère de nomenclature Windows masqué. Je pense que beaucoup de personnes qui parcourent les réponses apprécient la brièveté au lieu d’être autonomes, en particulier lorsque les réponses contiennent beaucoup plus de détails.
Cwash
4

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
cokedude
la source
3

Marque d'ordre d'octet (BOM)

Cela pourrait être causé par une nomenclature. Sur Wikipedia, une nomenclature est une

La marque d’octet (BOM) est un caractère Unicode, U + FEFF (BOM), dont l’apparence en tant que nombre magique au début d’un flux de texte peut signaler plusieurs choses à un programme consommant du 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 aux caractères de la nomenclature

Vous pouvez supprimer les caractères de nomenclature une fois que vous les connaissez comme ceci,

sed -i '1 s/^\xef\xbb\xbf//' *.txt
Fabien Haddadi
la source
0

J'ai eu le problème en ajoutant accidentellement un exécutable bash incorrect à la PATHet parce que dans mon script, le #!/usr/bin/env bashshebang plus souple était utilisé (prenez le premier exécutable bash du chemin).

command -v bash
/cygdrive/c/Program Files/Git/bin//bash

J'ai installé GIT pour Windows pour fonctionner cygwinavec les interfaces graphiques Windows GIT (ne fonctionnait pas avec cygwin native git ...). J'ai résolu ce problème maintenant en passant à #!/bin/bashsheband et en supprimant GIT pour Windows PATH.

Jan
la source
-3

Essayer #!/bin/bash

Deuxième chose: find / -name bash
Troisième chose:ls -al /bin/bash

Sebastian Szary
la source
Ou juste which bash. Nous savons qu'il en trouve un parce qu'il fonctionne avec bash script.sh.
Kevin
Vrai. Et comme mentionné, il existe une méthode beaucoup plus portable / usr / bin / env pour qu’un programme localise bash (ou un autre interpréteur) à votre place. Pas besoin de coder en dur un pah.
Hennes