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

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

  • Jai ce problème maintenant sous cygwin avec un script que je pourrais jurer fonctionnait déjà sans problème. Jai vérifié toutes les réponses, mais aucune ne semble convenir. Dautres questions et réponses mentionnaient également des problèmes 32/64 bits, mais pour les scripts shell, cela pourrait être exclu, non?
  • Vous avez trouvé la raison, ajouté des détails dans une nouvelle réponse unix.stackexchange.com/a/450389/62636 au cas où quelquun aurait également utilisé #!/usr/bin/env bash au lieu de #!/bin/bash et aussi en regardant ici …

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 toujours dos2unix 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

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 avec bash 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.

Laisser un commentaire

Votre adresse e-mail ne sera pas publiée. Les champs obligatoires sont indiqués avec *