Niveau :      
Résumé : echo -e

Vous croyez que 'ASCII est standard. Hé, bien ça n'a pas été le cas pendant longtemps. Entre les valeurs codées sur 5 bits, 6 bits, 7 bits, avec ou sans minuscules ou caractères spéciaux, rien n'était prévu pour que tout le monde se mette d'accord. IBM a pendant bien longtemps utilisé, et utilise encore, sur certains systèmes la norme EBCDIC qui n'a rien à de compatible avec l'ascii.

L'ASCII a donc été standardisé sur 7 bits, avec les caractères de base pour l'anglais, ainsi que divers codes comme ]+$ ... mais surtout, l'ASCII définit 32 caractères qui ne sont pas imprimables. En effet, les terminaux utilisaient (et utilisent encore) le même canal pour communiquer les caractères que pour ses appels de fonction. Ces 32 valeurs ont donc été prévues pour manipuler l'affichage. Parmi ces caractères les plus connus sont \n (retour à la ligne) et \t (tabulation). Notez des inconnus comme les caractères 14 et 15 qui permettent de changer de table de caractères (c'est grâce à eux que vous avez des interfaces textes bien dessinées), et d'autres ne sont plus du tout utilisés.

$ echo -e "\xe tqru \xf"

Notez qu'on peut envoyer des caractères à une application avec une combinaison de touches ctrl-... Mais ce n'était pas suffisant. D'un coté les caractères imprimables ont été étendus à 8 bits puis à l'unicode. D'un autre coté les fonctions du terminal ne se sont pas limitées à 32. Elles ont donc été étendues cette fois avec les séquences d'échappement ANSI. Cette fois il s'agit de préfixer une suite de caractères imprimables du caractère d'échappement (numéro 27). Il s'agit en fait d'un API. Les séquences les plus connues sont les changement de couleurs, exemple :

$ echo -e "\e[31;42mBonjour monde\e[0m"

Mais il y a pire, la plupart des terminaux utilisaient des centaines de séquences différentes (rarement standardisées). C'est ainsi qu'on a créé les bases termcap et terminfo pour essayer de faciliter la vie des clients.

Voila ce qui arrive quand on mélange données et code et qu'on ne respecte pas de standard. Faites donc attention à bien séparer code et données lorsque vous aurez à écrire un protocole.