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

71

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 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 cela signifie? Je faisais cela en tant qu'utilisateur root sous le groupe root .

Cela signifie-t-il que le fichier ne dispose pas de l'autorisation correcte pour l'utilisateur root ?

    
posée user165062 06.06.2013 - 22:17
la source

7 réponses

126

Ce n’est pas un problème de permission, vous n’avez pas de message sur les permissions

/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 un tel fichier: il s'appelle /bin/bash .

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

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

sed -i -e 's/\r$//' create_mgw_3shelf_6xIPNI1P.sh
    
réponse donnée Gilles 06.06.2013 - 22:25
la source
15

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

    
réponse donnée ortang 07.06.2013 - 10:33
la source
9

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

Le caractère de contrôle supplémentaire CR est affiché 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 du 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, lancez simplement cette commande ci-dessous et le fichier script sera converti sur place:

dos2unix create_mgw_3shelf_6xIPNI1P.sh

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

    
réponse donnée Byte Commander 15.12.2016 - 21:31
la source
4

Comme expliqué dans les autres réponses, il s’agit d’un problème de format. La réponse est donc de changer le format des terminaisons de style DOS en Unix. Ceci est 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
    
réponse donnée josediazaz 08.06.2013 - 00:50
la source
3

Ne vi <your script> .

puis :set list ; il affichera tous les caractères spéciaux de votre script.

puis remplacez le caractère:

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

    
réponse donnée Pankaj Sain 07.06.2013 - 09:41
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 ligne unix / Linux.

    
réponse donnée tphistry 03.12.2013 - 03:40
la source
2

Le problème que vous modifiez avec Dos!

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

:set ff=unix
:wq

et tout va bien

    
réponse donnée DaFreder 28.04.2016 - 18:29
la source

Lire d'autres questions sur les étiquettes