Forum Linux.debian/ubuntu Paquet debian 8 et commande echo

Posté par . Licence CC by-sa
Tags : aucun
1
10
jan.
2017

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 . É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 . Évalué à 1. Dernière modification le 11/01/17 à 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 (page perso) . É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 . É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 . Évalué à 3.

            Il suffit de mettre

            #!/bin/bash
            

            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 . Évalué à 1. Dernière modification le 11/01/17 à 17:37.

          Et je viens de relire, ce que j'ai écris qui est effectivement faux :

          Effectivement le problème vient de "dash"

  • # Ne pas utiliser echo

    Posté par (page perso) . É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érer printf qui est portable, elle.

    • [^] # Re: Ne pas utiliser echo

      Posté par (page perso) . Évalué à 3. Dernière modification le 11/01/17 à 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.

      # monprog_terminal_has_ansi_sequence_support
      #  Cheap detection of ANSI sequence support
      
      monprog_terminal_has_ansi_sequence_support()
      {
          case "${TERM}" in
              vt100*|xterm*)
                  printf 'yes';;
              *)
                  printf 'no';;
          esac
      }
      
      
      # prerr PRINTF-LIKE-ARGV
      #  Print error
      
      prerr()
      {
          if [ "${monprog_fruit_salad_output}" = 'yes' ]; then
              {
                  printf '\033[1;31mError: '
                  printf "$@"
                  printf '\033[0m\n'
              } 1>& 2
          else
              {
                  printf 'Error: '
                  printf "$@"
                  printf '\n'
              } 1>& 2
          fi
      }
      
      monprog_fruit_salad_output=$(monprog_terminal_has_ansi_sequence_support)
      
      prerr 'SSL certificate generation failed.'
      

      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 à ceux qui les ont postés. Nous n'en sommes pas responsables.