To Bom or not To Bom
Par Sébastien Bordes le mardi 12 juillet 2011, 09:28 - Système - Lien permanent
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 :
- Windows : <CR><LF>
- Unix : <LF>
- 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
On peut aussi facilement convertir les retours ligne en version UNIX
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:
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.
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 :
Element : lineEnding 1.0.0+ Sets the line-endings of the files in this fileSet. Valid values: - "keep" - Preserve all line endings - "unix" - Use Unix-style line endings - "lf" - Use a single line-feed line endings - "dos" - Use DOS-style line endings - "crlf" - Use Carraige-return, line-feed line endings



