Bonjour,
j'ai un problème d'affichage d'une commande "echo" lors de l'installation d'un paquet Debian.
Dans le postinst du paquet est utilisé la commande echo avec l'option -e pour pouvoir afficher des informations avec une couleur, ex:
echo -e "\\033[1;31m" "ERR - génération du dh pour le certificat"
Cela fonctionnait très bien en compilant sous Debian 7,
mais sous Debian 8, je me retrouve avec l'affichage du -e dans le terminal.
Quelqu'un aurait-il une idée pour corriger cela, ou même un autre solution pour mettre de la couleur dans les messages ?
Merci.
# il y a echo et echo…
Posté par JJD . Évalué à 7.
Salut,
En fait, dans ces deux cas, le "echo" qui est utilisé est certainement une commande interne du shell. Sous Debian 7, le shell par défaut était certainement bash alors que sous Debian 8 il s'agit vraisemblablement de dash (le changement est fait pour des raisons de performances et d'empreinte mémoire : dash est plus restreint mais bien plus léger que bash).
Du coup, on observe parfois des différences de comportement, comme pour echo (dans le cas de dash, echo ne comprend qu'une seule option, -n, et interprète systématiquement les séquences \…).
La solution pourrait donc être de simplement supprimer cette option -n, mais à ce moment-là, ça ne fonctionnera plus avec bash.
Tu peux aussi utiliser explicitement la commande externe /bin/echo avec l'option -n. Mais là encore, le résultat n'est pas garanti à 100%.
Ou alors, tu testes pour savoir si le echo utilisé a besoin du -n ou pas :
if [ "$(echo '\n')" = '\n' ]; then ECHO="echo -e" ; else ECHO=echo; fi
puis tu utilises $ECHO à la place de echo pour obtenir le résultat désiré.
Mais la meilleure solution est peut-être d'utiliser printf à la place d'echo :
printf "\\033[1;31m ERR - génération du dh pour le certificat\n"
devrait marcher à tous les coups.
À+,
JJD
[^] # Re: il y a echo et echo…
Posté par ly86 . Évalué à 1. Dernière modification le 11 janvier 2017 à 09:28.
Bonjour JJD.
Effectivement le problème vient de "dash", ce n'est pas la première fois que je me fait avoir.
Je vais voir pour l'utilisation de printf qui me semble une bonne solution.
Sinon pour l'instant j'ai fait un :
dpkg-reconfifgure dash
Pour remettre "bash" comme lien symbolique de "sh".
Merci pour la réponse.
[^] # Re: il y a echo et echo…
Posté par 🚲 Tanguy Ortolo (site web personnel) . Évalué à 4.
Non, le problème ne vient pas de dash, ce n'est pas bien de lui faire porter le chapeau alors qu'il fait très bien ce pour quoi il est fait : fournir un shell conforme à la norme POSIX.
Le problème vient du script qui prétend être exécutable sur un shell standard quelconque alors qu'il n'est pas vraiment portable.
[^] # Re: il y a echo et echo…
Posté par ly86 . Évalué à 1.
Je suis tout a fait d'accord. Mon but est un fonctionnement rapide sous un serveur que je gère.
Est effectivement, la solution que j'ai utilisé de changer dash par bash, n'est pas la bonne.
Je compte bien reprendre mon code pour intégré printf.
Merci
[^] # Re: il y a echo et echo…
Posté par dyno partouzeur du centre . Évalué à 3.
Il suffit de mettre
comme première ligne de ton script shell pour préciser qu'il doit être exécuté par bash
[^] # Re: il y a echo et echo…
Posté par ly86 . Évalué à 1. Dernière modification le 11 janvier 2017 à 17:37.
Et je viens de relire, ce que j'ai écris qui est effectivement faux :
# Ne pas utiliser echo
Posté par 🚲 Tanguy Ortolo (site web personnel) . Évalué à 4.
L'explication donnée au-dessus est la bonne, la commande
echo
se comporte de façon différente selon les shells. On dit qu'elle n'est pas portable.La solution donnée est mauvaise en revanche, la bonne façon de faire n'est pas de changer de shell, parce que cela cassera de même chez qui que ce soit qui n'utilise pas le même shell que toi. Ce qu'il faut, c'est éviter d'utiliser
echo
, et préférerprintf
qui est portable, elle.[^] # Re: Ne pas utiliser echo
Posté par Michaël (site web personnel) . Évalué à 3. Dernière modification le 11 janvier 2017 à 14:00.
Absolument. De plus l'utilisation de séquence de contrôle n'est pas super portable non plus, le moins serait de vérifier que la variable d'environnement mentionne un des émulateurs de terminal les plus courants qui comprennent ses variables.
C'est un exemple, mais il y a plein d'autres façons de faire. Notamment on peut utiliser un filtre sur la sortie d'erreur qui ajoute les couleurs. C'est cependant une bonne idée d'écrire quelques fonctions spécialisées pour l'écriture de message diagnostic, cela aide à avoir des messages cohérents.
Suivre le flux des commentaires
Note : les commentaires appartiennent à celles et ceux qui les ont postés. Nous n’en sommes pas responsables.