web-dev-qa-db-fra.com

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

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 qu'utilisateur root dans le groupe root.

Cela signifie-t-il que le fichier ne dispose pas des autorisations appropriées pour l'utilisateur root?

88
user165062

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. Ce fichier n'existe pas: il s'appelle /bin/bash.

Le ^M est un caractère de retour à la ligne . Linux utilise le caractère de saut de ligne pour marquer la fin d'une ligne, tandis 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
158
Gilles

Dans vim, vous pouvez également utiliser :set ff=unix puis enregistrer le fichier ou :set ff=dos pour obtenir à nouveau le formatage DOS.

18
ortang

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

Le caractère supplémentaire CR est codé sous la forme ^M dans votre sortie. Vous pouvez également le voir lorsque vous exécutez cat -A create_mgw_3shelf_6xIPNI1P.sh.

Pour convertir les fins de ligne de style DOS/Windows en style Unix, 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.

14
Byte Commander

Faites vi <your script>.

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

puis remplacez le personnage:

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

4
Pankaj Sain

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 dans le package tofrodos:

Sudo apt-get install tofrodos
4
josediazaz

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

3
DaFreder

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.

2
tphistry