Jai créé un script bash mais quand jessaye de lexécuter, jobtiens
#!/bin/bash no such file or directory
Je dois exécuter la commande: bash script.sh
pour que cela fonctionne.
Comment puis-je résoudre ce problème?
Commentaires
Réponse
Ce type de message est généralement dû à une fausse ligne de shebang, soit un retour chariot supplémentaire au bout du sapin première ligne ou une nomenclature au début.
Exécutez:
$ head -1 yourscript | od -c
et voyez comment cela se termine.
Cest faux:
0000000 # ! / b i n / b a s h \r \n
Cest faux aussi:
0000000 357 273 277 # ! / b i n / b a s h \n
Cest 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 nomenclature et des CR de queue:
sed -i "1s/^.*#//;s/\r$//" brokenScript
Notez que le shell que vous utilisez pour exécuter le script affectera légèrement les messages derreur affichés.
Voici trois scripts affichant 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
Exécution du bo gus en appelant explicitement linterpréteur permet au script CRLF de sexé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
Commentaires
- Une autre façon de révéler si tel est le problème est
hexdump -C yourscript | head -n 1
. Jutiliserais toujoursdos2unix yourscript
pour le résoudre. - Sil sagissait dun problème CRLF, vous ne verriez ‘ un message derreur
#!/bin/bash no such file or directory
, car il ny a ‘ aucune raison dessayer dexécuter ou douvrir#!/bin/bash
. Cest ‘/bin/bash<CR>
ce qui serait exécuté. - @StephaneChazelas Comme dos2unix a résolu le problème, il y a peu de doute il n’était pas ‘ un problème de CRLF. Le message derreur a probablement été simplement transcrit de manière inexacte.
-
dos2unix
supprime également une nomenclature UTF-8. Une nomenclature UTF-8 aurait pu expliquer le message derreur. - Il est triste à quel point Microsoft est incompatible. Même avec quelque chose daussi basique que lASCII.
Réponse
Cela peut également être causé par une nomenclature dans un UTF -8 script. Si vous créez le script sous Windows, vous obtenez parfois des fichiers indésirables au début du fichier.
Commentaires
- La nomenclature peut être supprimée facilement en utilisant awk, comme dans stackoverflow.com/questions/1068650/…
- Notez que Visual Studio pour Mac insérera une nomenclature.
Réponse
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
Commentaires
- » right » est un mot difficile à utiliser dans de tels cas. Peut-être quune meilleure phrase serait » moins sujette aux erreurs « .
- Cest aussi terrible; lhypothèse que / usr existe est une mauvaise IMO. Haiku, par exemple, na pas / usr.
Answer
Vous pouvez utiliser vi pour résoudre les deux problèmes si elles existent:
vi <your_file> :set ff=unix :set nobomb :wq
Commentaires
- Les réponses doivent être autonomes autant que possible. La question ne mentionne pas deux problèmes; si vous comptez vous appuyer sur d’autres réponses, vous devez au moins dire ce qu’elles sont. Mieux encore, vous devriez expliquer comment cela répond à la question.
- Solution très rapide sans télécharger plus doutils Windows, merci!
- @ G-Man Autres réponses mentionnez déjà cela avec beaucoup plus de détails que je ne souhaite entrer.Inutile de répéter, mais si ‘ nest pas douloureusement évident, vous pouvez avoir une fin de ligne WIndows et un caractère de nomenclature Windows masqué. Je pense que beaucoup de gens qui analysent les réponses apprécient la brièveté au lieu dêtre autonomes, surtout quand il y a beaucoup plus de détails dans dautres réponses.
Réponse
Si vous navez pas dos2unix, cest une façon de résoudre ce problème.
cp script _p4 && tr -d "\r" < _p4 > script && rm _p4
Réponse
Marque dordre des octets (BOM)
Cela peut être causé par une nomenclature. Daprès Wikipedia, une nomenclature est une
La marque dordre doctet (BOM) est un caractère Unicode, U + FEFF marque dordre doctet (BOM) , dont lapparence comme un nombre magique au début dun flux de texte peut signaler plusieurs choses à un programme qui consomme du texte
Malheureusement, il 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 sils correspondent à lun des caractères de la nomenclature manuellement
Vous pouvez supprimer les caractères de la nomenclature une fois que vous les connaissez comme ceci ,
sed -i "1 s/^\xef\xbb\xbf//" *.txt
Réponse
Jai eu le problème en ajoutant accidentellement un mauvais bash exécutable sur le PATH
et parce que dans mon script, le shebang #!/usr/bin/env bash
plus flexible a été utilisé (prendre le premier exécutable bash du chemin). >
command -v bash /cygdrive/c/Program Files/Git/bin//bash
Jai installé GIT pour Windows pour quil fonctionne dans cygwin
avec les interfaces graphiques Windows GIT (ne fonctionnait pas avec git natif cygwin …). Jai résolu ce problème maintenant en passant à #!/bin/bash
sheband et en supprimant GIT pour Windows de PATH
.
Réponse
Essayez #!/bin/bash
Deuxième chose: find / -name bash
Troisième chose: ls -al /bin/bash
Commentaires
- Ou simplement
which bash
. Nous savons quil ‘ en trouver un car ‘ fonctionne avecbash script.sh
. - Vrai. Et comme mentionné, il existe la méthode beaucoup plus portable / usr / bin / env pour quun programme localise bash (ou un autre interpréteur) pour vous. Pas besoin de coder en dur un pah.
#!/usr/bin/env bash
au lieu de#!/bin/bash
et aussi en regardant ici …