Impossible d'exécuter un fichier .sh: / bin / bash ^ M: interpréteur incorrect

107

Je voulais exécuter un script shell:

-rwxr-x--x 1 root root   17234 Jun  6 18:31 create_mgw_3shelf_6xIPNI1P.sh

J'ai essayé de faire une procédure standard, mais j'ai eu cette erreur:

./create_mgw_3shelf_6xIPNI1P.sh 
localhost 389 -l /opt/fews/sessions/AMGWM19/log/2013-06-06-143637_CLA-0 
DEBUG   cd/etc/opt/ldapfiles/ldif_in ;
./create_mgw_3shelf_6xIPNI1P.sh 
localhost 389 -l /opt/fews/sessions/AMGWM19/log/2013-06-06-143637_CLA-0
**ERROR  sh: ./create_mgw_3shelf_6xIPNI1P.sh: /bin/bash^M: bad interpreter: No such file or directory**

Qu'est-ce que ça veut dire? Je faisais cela en tant rootqu'utilisateur du rootgroupe.

Cela signifie-t-il que le fichier n'a pas la permission correcte pour l' rootutilisateur?

utilisateur165062
la source

Réponses:

182

Ce n'est pas un problème d'autorisation, vous ne recevez pas de message sur les autorisations

/bin/bash^M: bad interpreter: No such file or directory

Le script indique qu'il doit être exécuté par un shell situé à /bin/bash^M. Il n'y a pas de tel fichier: ça s'appelle /bin/bash.

Le ^Mest un caractère de retour chariot . Linux utilise le caractère de saut de ligne pour marquer la fin d'une ligne, alors que Windows utilise la séquence CR LF à deux caractères. Votre fichier a des fins de ligne Windows, ce qui crée une confusion pour Linux.

Supprimez les caractères CR parasites. Vous pouvez le faire avec la commande suivante:

sed -i -e 's/\r$//' create_mgw_3shelf_6xIPNI1P.sh
Gilles
la source
22
Ou installez et utilisez le dos2unixprogramme.
argentpepper
4
merci pour cela, toutes les autres réponses que j'ai trouvées jusqu'à présent n'ont pas aidé. Celui-ci l'a fait!
Qodeninja
ne doit pas être Windows, j'ai reçu un message similaire après avoir copié un script d'OS X vers Ubuntu ... dos2unix a bien fonctionné dans ce cas, alors que remplacer "\ r" par "rien" serait pire, puisqu'il n'y a pas de "\". n 'caractères dans le fichier.
Michael
1
@Michael macOS utilise \nparce que c'est Unix. Le script était peut-être d'une version antérieure de Mac OS? Vous pourriez courir sed -i -e 's/\r$/\n/' script.shdans ce cas.
wjandrea
1
Ouvrez-le dans gedit et faites Enregistrer sous, puis sélectionnez "Fin de ligne: Unix / Linux"
Mattmon
23

Dans vim, vous pouvez également utiliser :set ff=unixpuis enregistrer le fichier ou :set ff=dosobtenir à nouveau le formatage DOS.

ortang
la source
celui-ci l'a fait pour moi, thx
bunkerdive
19

Votre fichier a des fins de ligne de style DOS / Windows (CR LF) , mais sur les systèmes de type Unix, seul le caractère de contrôle LF est utilisé comme saut de ligne.

Le caractère de contrôle CR supplémentaire est codé comme ^Mdans votre sortie. Vous pouvez aussi le voir quand vous courez cat -A create_mgw_3shelf_6xIPNI1P.sh.

Pour convertir les fins de ligne de style DOS / Windows en style Unix, il existe un outil appelé dos2unix. Vous l'installez en utilisant:

sudo apt-get install dos2unix

Ensuite, vous pouvez simplement convertir les fins de ligne des fichiers dans les deux sens en utilisant

dos2unix FILENAME
unix2dos FILENAME

Dans votre cas, exécutez simplement la commande ci-dessous et le fichier de script sera converti sur place:

dos2unix create_mgw_3shelf_6xIPNI1P.sh

Après cela, Bash devrait pouvoir interpréter le fichier correctement.

Byte Commander
la source
1
Merci, dos2unix est également disponible pour macOS via brassage.
Muhammad Annaqeeb
5

Le problème est que vous éditez avec Dos!

ouvrez votre fichier avec vi puis définissez unix avec:

:set ff=unix
:wq

et tout va bien

DaFreder
la source
4

Faire vi <your script>.

puis :set list; il affichera n'importe lequel des caractères spéciaux de votre script.

puis remplacez le personnage:

:%s/^M//gc [pour taper ^Mappuyez sur Ctrl+ v+ m]

Pankaj Sain
la source
Voir la réponse ci-dessus à propos de l'utilisation de: fileformat, qui est à mon humble avis meilleur à ce sujet que la substitution globale. Voir aussi stackoverflow.com/questions/14609779/… pour des idées sur la façon de gérer automatiquement
qneill
4

Comme expliqué dans les autres réponses, il s'agit d'un problème de format. La solution consiste donc à changer le format de fin de ligne de style DOS en style Unix. C'est encore un autre moyen simple de réparer votre fichier "en place"

fromdos file

Il est disponible en package tofrodos:

sudo apt-get install tofrodos
Josediazaz
la source
2

Vous pouvez également utiliser gedit pour supprimer les caractères indésirables. Dans le menu Fichier, sélectionnez Enregistrer sous et définissez le type de fin de ligne unix / Linux.

tphistry
la source
+1 pour cela car cela m'a aidé avec les fins de ligne MacOS.
Bobble