Question 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 comme le root utilisateur sous le root groupe.

Cela signifie-t-il que le fichier n’a pas la permission correcte pour le root utilisateur?


72
2018-06-06 20:17


origine




Réponses:


Ce n'est pas un problème d'autorisation, vous n'obtenez 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 un tel fichier: il s'appelle /bin/bash.

le ^M est un caractère 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 à 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

127
2018-06-06 20:25



Ou installez et utilisez le dos2unix programme. - argentpepper
merci pour cela, toutes les autres réponses que j'ai trouvées jusqu'ici n'ont pas aidé. Celui-ci l'a fait! - qodeninja
ne doit pas forcément être Windows, j'ai reçu un message similaire après avoir copié un script depuis OS X vers Ubuntu ... dos2unix fonctionnait très bien dans ce cas, alors que remplacer '\ r' avec rien serait pire, car il n'y a pas de '\ n caractères dans le fichier. - Michael
@Michael macOS utilise \n parce que c'est Unix. Le script provenait peut-être d'une version antérieure de Mac OS? Tu pourrais courir sed -i -e 's/\r$/\n/' script.shdans ce cas. - wjandrea
Ouvrez-le dans gedit et, faites Enregistrer sous et sélectionnez "Fin de ligne: Unix / Linux" - Mattmon


En vim vous pouvez aussi utiliser :set ff=unix puis enregistrez le fichier ou :set ff=dos pour obtenir à nouveau le formatage DOS.


15
2018-06-07 08:33



celui-ci l'a fait pour moi, merci - bunkerdive


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

Le supplémentaire CR caractère de contrôle est montré codé comme ^M dans votre sortie. Vous pouvez aussi le voir quand vous courez 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, exécutez 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 le fichier correctement.


10
2017-12-15 20:31





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. C'est encore un autre moyen simple de réparer votre fichier "in place"

fromdos file

Il est disponible en paquet tofrodos:

sudo apt-get install tofrodos

4
2018-06-07 22:50





Faire 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           [taper ^M presse Ctrl + v + m]


3
2018-06-07 07:41



Voir ci-dessus la réponse à propos de l'utilisation de: fileformat qui est IMHO mieux pour gérer cela que la substitution globale Voir aussi stackoverflow.com/questions/14609779/… pour des idées sur la façon de gérer automatiquement - qneill


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
2017-12-03 02:40



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


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


2
2018-04-28 16:29