Forum Programmation.shell Différentes version du shell ?

Posté par (page perso) . Licence CC by-sa
Tags : aucun
1
6
juin
2013

Bonjour, j'ai commencé à apprendre le shell hier afin d'écrire deux script dont l'un permet de lancer un binaire et le second d'installer un binaire et ses fichiers. Pas de soucis, car tout fonctionne correctement sur une distribution récente (FC18 et ArchLinux), cependant lorsque j'ai testé le script d'installation sur Ubuntu 12.04, il a commencé à paniquer en me renvoyant quelques erreurs de syntaxe.

Donc j'en viens à ma question, est-ce qu'ils existe une syntaxe différente en fonction de chaque version du shell ? Car j'avoue ne pas comprendre pour ça marche très bien sur Fedora et ArchLinux…

Merci

  • # Oui

    Posté par (page perso) . Évalué à 3.

    Oui, il existe plusieurs shells. En général, tous acceptent la même syntaxe de base telle que définie par POSIX, mais chacun peut aussi accepter une syntaxe étendue qui lui est propre (et donc incompatible avec les autres shells).

    Le shell « classique » des distributions GNU/Linux est bash (du projet GNU), mais ce n’est plus aussi systématique que par le passé et Debian et Ubuntu notamment utilisent aujourd’hui à ma connaissance dash par défaut.

    Ton script fait probablement usage de « bashismes », c’est-à-dire des extensions non-POSIX propres à bash qui ne sont pas reconnues par dash.

    Pour qu’un script shell fonctionne partout, il faut se restreindre à la syntaxe POSIX standard.

    • [^] # Re: Oui

      Posté par (page perso) . Évalué à 2. Dernière modification le 06/06/13 à 11:37.

      Le shell « classique » des distributions GNU/Linux est bash (du projet GNU), mais ce n’est plus aussi systématique que par le passé et Debian et Ubuntu notamment utilisent aujourd’hui à ma connaissance dash par défaut.

      Attention, il ne faut pas comprendre ici qu'on se retrouve avec dash quand on ouvre un terminal sous Debian ou Ubuntu. C'est juste que /bin/sh est un lien vers /bin/dash.

      Si tu veux utiliser des bashismes, mets /bin/bash (Dolmen/Olivier Mengué dirait que c'est pas comme ça qu'on fait bien, mais je retrouve plus sa présentation).

      EDIT : ah bah si, j'ai retrouvé la présentation => http://o.mengue.free.fr/presentations/2008-fpw/Mieux-programmer-en-shell.pdf

      It's a fez. I wear a fez now. Fezes are cool !

    • [^] # Re: Oui

      Posté par . Évalué à 5. Dernière modification le 06/06/13 à 11:37.

      mouais, moi je me contente des bashrie en commençant mes scripts par #!/bin/bash

      Il ne faut pas décorner les boeufs avant d'avoir semé le vent

      • [^] # Re: Oui

        Posté par (page perso) . Évalué à 2.

        Merci, j'y vois enfin plus clair ! Le début de mon script commence par

        #!/bin/sh
        
        

        il serait donc plus judicieux de commencer par

        #!/bin/bash ?
        
        
        • [^] # Re: Oui

          Posté par . Évalué à 3.

          oui, sh est très restreint, même si assez souvent c'est un lien vers /bin/bash, toutes les distributions ne le font pas (justement certaines l'envoient vers /bin/dash)

          Il ne faut pas décorner les boeufs avant d'avoir semé le vent

          • [^] # Re: Oui

            Posté par (page perso) . Évalué à 1.

            Super merci ! Je viens d'essayer sur Ubuntu, et ça marche parfaitement bien.

        • [^] # Re: Oui

          Posté par (page perso) . Évalué à 5.

          Non, il serait plus judicieux d'éviter d'utiliser les fonctionnalités spécifiques à Bash, qui sont la plupart du temps inutiles. Tes scripts n'en seront que plus portables et plus rapides à exécuter.

          • [^] # Re: Oui

            Posté par (page perso) . Évalué à 2.

            Je ne suis pas vraiment d'accord. Debian est passé à dash pour l'init principalement. Un utilisateur lambda a toujours bash et non dash comme shell interactif !

            Il y a quand même des choses pratiques en bash comme "a=$(( ${b} + 13 ))" sans avoir besoin de lancer des sous processus. Il manque à mon sens les tables de hash car les tableaux sont peu pratique…

            Que le système démarre sous dash et non bash est très bien car dash est plus léger, plus réduit et donc plus sur dans le système d'init. Par contre, c'est pénible que "/etc/X11/Xsession" sous en /bin/sh (je le passe en /bin/bash sur mes postes utilisateurs) car cela signifie que la session X11 n'est pas équivalente à une session ssh pour un utilisateur. Je sais que les environnement de bureau moderne s'en foute car ils mettent tout sous dbus (même le hostname) mais je continue à croire que la philosophie des variables d'environnement est bien plus sur, plus simple et largement suffisante dans bien des cas (voir SSH_AGENT).

            • [^] # Re: Oui

              Posté par (page perso) . Évalué à 3.

              Il y a quand même des choses pratiques en bash comme "a=$(( ${b} + 13 ))"

              Qui est une syntaxe shell standard !

              Que le système démarre sous dash et non bash est très bien car dash est plus léger, plus réduit et donc plus sur dans le système d'init. Par contre, c'est pénible que "/etc/X11/Xsession" sous en /bin/sh (je le passe en /bin/bash sur mes postes utilisateurs) car cela signifie que la session X11 n'est pas équivalente à une session ssh pour un utilisateur.

              Et ?

              • [^] # Re: Oui

                Posté par (page perso) . Évalué à 2.

                Qui est une syntaxe shell standard !

                Exact, je m'en suis rendu compte après coup, mais je me suis déjà fait avoir avec mais sur un autre shell…

                Et ?

                Et bien si tu as des scripts que tu sources au démarrage de session (type ssh) afin de mettre en place ton environnement, il faut aussi les sourcer dans le Xsession. C'est prévu me dira tu sauf que via ssh, tu source avec bash, normal tu as bash comme shell et là, tu source avec dash qui ne ne comporte pas pareil.

                Sachant que 100% de mes utilisateurs utilisant X ont bash, je trouve normal que le shell initial d'X soit en bash et non en dash.

      • [^] # Re: Oui

        Posté par (page perso) . Évalué à 3.

        parce que me passer du $() et autre truc qui simplifient la vie c'est limite de la torture ;)

        La construction $() fait partie de la syntaxe normalisée par POSIX. ;)

        Il ne faut pas confondre « shell POSIX » avec « bourne shell » : le bourne shell est le shell historique d’UNIX version 7, datant des années 70, tandis que shell POSIX désigne la version normalisée par POSIX à partir de 1992, incluant déjà nombres d’extension par rapport au bourne shell.

        • [^] # Re: Oui

          Posté par . Évalué à 3.

          héhé désolé je me suis rendu compte de ma boulette ;) et j'ai édité avant que tu répondes :D, mais je me suis déjà trouvé dans des shells ne reconnaissant pas le $( ), mais impossible de me souvenir lesquels.

          J'aimerai bien savoir quelle bashrie ne fonctionne pas en dash ;)

          Il ne faut pas décorner les boeufs avant d'avoir semé le vent

          • [^] # Re: Oui

            Posté par (page perso) . Évalué à 3.

          • [^] # Re: Oui

            Posté par . Évalué à 1.

            Il y existe un utilitaire nommé checkbashisms qui te permet de vérifier tes scripts,
            un petit tour dans les sources devraient t'éclairer au pire.
            Sinon tu peux chercher la manpage de sh/dash quand tu as un doute sur une construction.

            Une des constructions que je connais être un bashisme est la suivante :

            #> mv foo{bar,buz}buz.txt
            
            

            qui est l'équivalent de :

            #> mv foobarbuz.txt foobazbuz.txt
            
            
            • [^] # Re: Oui

              Posté par (page perso) . Évalué à 3.

              Une des constructions que je connais être un bashisme […]

              Que je sais être…

              • [^] # Re: Oui

                Posté par . Évalué à 1.

                Merci.
                Une explication, une réf ? sinon je ne vais pas retenir. :)

                • [^] # Re: Oui

                  Posté par (page perso) . Évalué à 5.

                  Je sais que c'est un bashisme. Ça sonne bien.

                  Je connais que c'est un bashisme. Ça sonne mal, ça n'est pas du tout français, le verbe connaître a l'air de ne prendre comme complément d'objet direct que des substantifs, en tout cas pas des propositions.

Suivre le flux des commentaires

Note : les commentaires appartiennent à ceux qui les ont postés. Nous n'en sommes pas responsables.