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 gouttegd . É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 Framasky (site web personnel) . Évalué à 2. Dernière modification le 06 juin 2013 à 11:37.
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
Being a sysadmin is easy. As easy as riding a bicycle. Except the bicycle is on fire, you’re on fire and you’re in Hell.
[^] # Re: Oui
Posté par fearan . Évalué à 5. Dernière modification le 06 juin 2013 à 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 shingo (site web personnel) . Évalué à 2.
Merci, j'y vois enfin plus clair ! Le début de mon script commence par
il serait donc plus judicieux de commencer par
[^] # Re: Oui
Posté par fearan . É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 shingo (site web personnel) . Évalué à 1.
Super merci ! Je viens d'essayer sur Ubuntu, et ça marche parfaitement bien.
[^] # Re: Oui
Posté par 🚲 Tanguy Ortolo (site web personnel) . É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 Sytoka Modon (site web personnel) . É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 🚲 Tanguy Ortolo (site web personnel) . Évalué à 3.
Qui est une syntaxe shell standard !
Et ?
[^] # Re: Oui
Posté par Sytoka Modon (site web personnel) . Évalué à 2.
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 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 gouttegd . Évalué à 3.
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 fearan . É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 🚲 Tanguy Ortolo (site web personnel) . Évalué à 3.
https://wiki.ubuntu.com/DashAsBinSh
[^] # Re: Oui
Posté par Frédéric Heulin . É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 :
qui est l'équivalent de :
[^] # Re: Oui
Posté par 🚲 Tanguy Ortolo (site web personnel) . Évalué à 3.
Que je sais être…
[^] # Re: Oui
Posté par Frédéric Heulin . Évalué à 1.
Merci.
Une explication, une réf ? sinon je ne vais pas retenir. :)
[^] # Re: Oui
Posté par 🚲 Tanguy Ortolo (site web personnel) . É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 à celles et ceux qui les ont postés. Nous n’en sommes pas responsables.