Not able to execute a .sh file: /bin/bash^M: bad interpreter

Il y a quelques mois (déjà …), alors que je modifiais des scripts Linux d’installation automatique de logiciels, je me suis retrouvé avec le message suivant dans ma console.

Not able to execute a .sh file: /bin/bash^M: bad interpreter

Sur le moment je n’ai pas trop compris d’où venait le problème. Et puis je me suis rendu compte que j’avais effectué des modifications du script depuis une machine Windows et j’avais commit la nouvelle version vers mon Git.

D’où viens le problème ?

En fait, le fichier a été transféré entre des systèmes de types différents avec des conventions de nouvelle ligne différentes.
Les éditeurs de texte Windows auront un caractère de retour chariot spécial (CR + LF) à la fin des lignes pour indiquer un retour de ligne ou une nouvelle ligne, qui sera affiché de manière incorrecte sous Linux (^ M).
Souvent, c’est parce que le fichier est créé ou peut-être même édité sur un ordinateur Microsoft Windows, puis téléchargé ou transféré sur un serveur Linux. Cela se produit généralement lorsqu’un fichier est transféré à partir de MS-DOS (ou MS-Windows) sans mode ASCII ou texte.
Cela peut être difficile à détecter. En effet, certaines applications ou programmes gèrent correctement les caractères de nouvelle ligne alors que d’autres non.
Ainsi, certains services peuvent tomber en panne ou ne pas répondre correctement.

Comment résoudre le problème ?

Il existe plusieurs solutions possible 🙂

  • Le logiciel/paquet dos2unix
dos2unix monfichierAmodifier
  • sed
sed -e "s/\^M//"  monfichierAmodifier  > monfichierModifier 
  • Vim (ma solution préféré mais pas aussi rapide que dos2unix)

Après avoir ouvert le fichier avec Vim taper

:%s/^M//g

Et voilà, vous ne devriez plus avoir de soucis 🙂