Qu'y a t-il de plus pénible que de s'apercevoir que son script shell tout fraichement déployé sur un serveur ne fonctionne pas correctement à cause de problème d'encodage ...

Avec une erreur du style ou autre

-bash: ./ttoto.sh : /bin/bash^M : mauvais interpréteur: Aucun fichier ou dossier de ce type

2 problèmes peuvent survenir, l'encodage des retours à la ligne et l'en tête BOM.

Il faut noter que certaines versions d'UNIX sont compatible avec les retours lignes CR+LF et avec BOM , dans ce cas veuillez vérifier que votre fichier est bien exécutable.....

Pour le premier, il suffit de convertir les retours ligne au format UNIX,

Pour rappel :

  1. Windows : <CR><LF>
  2. Unix : <LF>
  3. Mac : <CR>

CR => Carriage return \r en UTF-8 => 0D LF => Line Feed \n , en UTF-8 => 0A

Dans Notepad++ on peut facilement visualiser les retours ligne en activant l'option Affichage>Symboles spéciaux>Afficher tous les caractères

bom_1.png

On peut aussi facilement convertir les retours ligne en version UNIX

bom_2.png

Par défaut Eclipse utilise les retours lignes spécifiés dans Windows>Preferences>General>Workspace>New text file line delimiter avec l'encodage spécifié Windows>Preferences>General>Workspace>Text file encoding. Si toutefois votre script ne fonctionne pas et vous dit qu'il y a un problème avec le shebang #! (/bin/bash) alors vous devez avoir un problème de BOM (Byte Order Mask)

Ouvrez votre fichier avec un éditeur héxadécimal:

bom_4.png

Pour un fichier UTF-8 on s'apercoit qu'il y a la séquence EF BB BF qui est mal interprété par le shell bash

Dans Notepad++ réencoder le fichier SANS BOM.

bom_3.png

et maintenant votre script fonctionnera correctement.

On peut aussi noter que le plugin maven-assembly-plugin propose un attribut fort utile pour mettre à jour les saut de ligne à la volée :

  1. Element : lineEnding
  2. 1.0.0+
  3. Sets the line-endings of the files in this fileSet. Valid values:
  4. - "keep" - Preserve all line endings
  5. - "unix" - Use Unix-style line endings
  6. - "lf" - Use a single line-feed line endings
  7. - "dos" - Use DOS-style line endings
  8. - "crlf" - Use Carraige-return, line-feed line endings