Koozali.org: home of the SME Server
Other Languages => Français => Topic started by: Xavier.A on December 11, 2014, 01:05:10 PM
-
Salut le(s) dev(s) français de la SME Server,
Dans les derniers bouts de code que j'ai inspecté j'ai eu mal aux yeux. On ne peut pas dire que c'est des bogues mais ça risque de poser des soucis de maintenabilité de ton(votre) code dans le futur.
Il existe plusieurs interpréteur de commandes : sh, csh, ksh*, bash*, dash, etc... Il est important de comprendre les différences entre les différents interpréteurs (norme POSIX) parce qu'ils ne servent pas pour faire les mêmes choses et que surtout ils ne sont pas forcément compatibles entre eux !
Pour REDHAT family man sh pointe sur man BASH, sur DEBIAN family man sh pointe sur man DASH mais sur FREEBSD man sh pointe bien sur man SH ;-)
En clair, un script écrit sur REDHAT avec bash ne sera pas utilisable sur DEBIAN ou sur FREEBSD. (cf https://wiki.ubuntu.com/DashAsBinSh (https://wiki.ubuntu.com/DashAsBinSh) qui explique plutôt bien la situation et le pourquoi du changement de langage pour les scrips shell)
En quoi ça vous concerne?
Ca peut vous aider à progresser au niveau des bonnes pratiques, de conserver un maximum de compatibilité avec la norme POSIX et donc de garantir la portabilité des scripts. L'utilisation du bash ne se justifie pas dans tous les cas.
Si vous codez sur DEBIAN Jessie par exemple et que vous utilisez /bin/bash peut-être qu'un jour les scripts ne seront plus fonctionnels sur REDHAT, si REDHAT choisi de basculer sur /bin/dash.
Prenons l'exemple des scripts check4contribsupdates et check4updates situés dans /sbin/e-smith dans la SME 9 :
cat /sbin/e-smith/check4updates
#! /bin/bash
mkdir -p /tmp/check4updates.$$
TMPFILE=`mktemp /tmp/check4updates.$$/XXXXXXXXXX` || exit 1
TMP1=`mktemp /tmp/check4updates.$$/XXXXXXXXXX` || exit 1
MAILADDR=admin-yum
yum -e 0 -d 0 check-update > $TMP1
if [ $? = 100 ]; then
echo -e "===\n=== yum reports available updates:\n===" >> $TMPFILE
cat $TMP1 >> $TMPFILE
fi
if [ -s $TMPFILE ]; then
if [ "$1" = "-m" ]; then
mail -s "Updates available for `hostname`" $MAILADDR < $TMPFILE
else
echo "Updates available for `hostname`"
cat $TMPFILE
fi
fi
rm -f $TMPFILE $TMP1
rm -fr /tmp/check4updates.*
et
cat /sbin/e-smith/check4contribsupdates
#! /bin/bash
mkdir -p /tmp/check4contribsupdates.$$
TMPFILE=`mktemp /tmp/check4contribsupdates.$$/XXXXXXXXXX` || exit 1
TMP1=`mktemp /tmp/check4contribsupdates.$$/XXXXXXXXXX` || exit 1
MAILADDR=admin-yum
yum -e 0 -d 0 check-update --disablerepo=* --enablerepo=smecontribs > $TMP1
if [ $? = 100 ]; then
echo -e "===\n=== yum reports available updates for Contribs :\n===" >> $TMPFILE
cat $TMP1 >> $TMPFILE
echo -e "\n To apply all these updates, you can log on your server and run the following command :\n
yum update --enablerepo=smecontribs\n" >> $TMPFILE
fi
if [ -s $TMPFILE ]; then
if [ "$1" = "-m" ]; then
mail -s "SME Server Contribs Updates available for `hostname`" $MAILADDR < $TMPFILE
else
echo "SME Server Contribs Updates available for `hostname`"
cat $TMPFILE
fi
fi
rm -f $TMPFILE $TMP1
rm -fr /tmp/check4contribsupdates.*
On tombe sur 2 exemples de bashism, cette page http://mywiki.wooledge.org/Bashism (http://mywiki.wooledge.org/Bashism) donne des exemples de substitutions de code pour rendre les scripts plus conforme à la norme POSIX.
Pour l'instant ce n'est pas catastrophique mais un jour alors que vous essaierez de faire fonctionner un bout de code comme le suivant :
#!/bin/sh
#VAR
i=0
#BEGIN
while ((i++ < 10)); do
echo "\$i=$i"
done
#END
et que ça ne fonctionnera pas en sh ou en dash vous saurez pourquoi ;-)
chao
-
Completely off topic here. These forums are about SME Server specifically.
-
@all: first of all I beg your pardon for posting here in english
Kid_of_leognan:
thank you for your observations..
unfortunately, this is the wrong place/way to discuss such a theme.
please, post your suggestions/doubts/ideas in bugzilla, and in english.
thank you.
locking the topic
-
Topic unlocked as requested
@Kid_of_leognan: please post to bugzilla too, TIA
-
Salut Xavier
Merci pour le lien, je prendrai le temps de le parcourir, mais maintenant un code est écris pour satisfaire un besoin direct, pas pour être porté vers une autre distribution même si je comprend l'idée générale de ta réflexion. En effet ici ce code fonctionne pour yum, donc aucune interopérabilité avec Debian.
La SME existe depuis 1999(1998 ?) et du code vieux, vieillis, il y en a, crois moi.
Au cas ou tu te poserai la question, j'ai demandé a débloquer ce topic.
-
Au cas ou tu te poserai la question, j'ai demandé a débloquer ce topic.
Ce n'était pas nécessaire de le faire débloquer mais comme tu as fait un effort je vais en faire un dernier...
Pour en revenir très rapidement au billet, il fallait se montrer un peu plus fin et bien le lire pour le comprendre car la problématique ici n'est pas la portabilité mais la performance par le respect de la norme. Rien ne t’empêche d'utiliser le shebang (#!) que tu veux mais dans certain cas "#!/bin/sh" est plus indiqué que "#!/bin/bash" J'aurais pu compléter le billet mais franchement je me moque complètement du devenir de la SME maintenant.
Il faudrait tout de même que vous pensiez à conserver l'idée de minimisation du serveur sans rajouter du code qui ne se justifie pas ou dont la performance risque de peser sur le système dans l'avenir.
Sans chercher à te retrancher derrière des excuses et pour ta culture tu peux tout de même consulter les pages suivantes :
- https://www.gnu.org/software/autoconf/manual/autoconf-2.64/html_node/Shellology.html (https://www.gnu.org/software/autoconf/manual/autoconf-2.64/html_node/Shellology.html)
- http://wiki.bash-hackers.org/scripting/bashbehaviour (http://wiki.bash-hackers.org/scripting/bashbehaviour)
- https://en.wikibooks.org/wiki/Guide_to_Unix/Explanations/Choice_of_Shell (https://en.wikibooks.org/wiki/Guide_to_Unix/Explanations/Choice_of_Shell)
Cependant tes camarades ont montré que :
- Le forum français ne doit plus être en français,
- Le forum français n'est pas respectable en tant que lieu d'échange légitime entre français,
- Le forum français est définitivement mort !
ainsi soit-il !
-
J'aurais pu compléter le billet mais franchement je me moque complètement du devenir de la SME maintenant.
in this case your original post has no reason.. you are only trowing a stone and hiding your hand..
Il faudrait tout de même que vous pensiez à conserver l'idée de minimisation du serveur sans rajouter du code qui ne se justifie pas ou dont la performance risque de peser sur le système dans l'avenir.
Sans chercher à te retrancher derrière des excuses et pour ta culture tu peux tout de même consulter les pages suivantes :
- https://www.gnu.org/software/autoconf/manual/autoconf-2.64/html_node/Shellology.html (https://www.gnu.org/software/autoconf/manual/autoconf-2.64/html_node/Shellology.html)
- http://wiki.bash-hackers.org/scripting/bashbehaviour (http://wiki.bash-hackers.org/scripting/bashbehaviour)
- https://en.wikibooks.org/wiki/Guide_to_Unix/Explanations/Choice_of_Shell (https://en.wikibooks.org/wiki/Guide_to_Unix/Explanations/Choice_of_Shell)
thank you..
Cependant tes camarades ont montré que :
- Le forum français ne doit plus être en français,
- Le forum français n'est pas respectable en tant que lieu d'échange légitime entre français,
- Le forum français est définitivement mort !
ainsi soit-il !
first of all, no need to be sarcastic
moreover, I prefer to write in english instead that trying to post something in a "robotized" french translation, simbply because je ne sais pas le français.. ok?
finally, you should always remember that I (but not only me) read almost everything posted on contribs.org.. you can find posts of mine in spanish too.
please, post your observations and suggestion in bugzilla too, thank you