Koozali.org: home of the SME Server

Conseil pour le(s) dev(s) smeserver sur la programmation Shell

Offline Xavier.A

  • ****
  • 104
  • +0/-0
Conseil pour le(s) dev(s) smeserver sur la programmation Shell
« 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 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 :
Code: [Select]
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
Code: [Select]
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 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 :
Code: [Select]
#!/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
« Last Edit: December 11, 2014, 01:27:52 PM by kid_of_leognan »
“When the wise man points to the moon, the fool looks at the finger.”

guest22

Re: Conseil pour le(s) dev(s) smeserver sur la programmation Shell
« Reply #1 on: December 11, 2014, 01:34:51 PM »
Completely off topic here. These forums are about SME Server specifically.

Offline Stefano

  • *
  • 10,894
  • +3/-0
Re: Conseil pour le(s) dev(s) smeserver sur la programmation Shell
« Reply #2 on: December 11, 2014, 02:10:09 PM »
@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

Offline Stefano

  • *
  • 10,894
  • +3/-0
Re: Conseil pour le(s) dev(s) smeserver sur la programmation Shell
« Reply #3 on: December 11, 2014, 04:27:29 PM »
Topic unlocked as requested

@Kid_of_leognan: please post to bugzilla too, TIA

Offline stephdl

  • *
  • 1,523
  • +0/-0
    • Linux et Geekeries
Re: Conseil pour le(s) dev(s) smeserver sur la programmation Shell
« Reply #4 on: December 11, 2014, 04:40:05 PM »
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.
See http://wiki.contribs.org/Koozali_Foundation
irc : Freenode #sme_server #sme-fr

!!! Please write your knowledge to the Wiki !!!

Offline Xavier.A

  • ****
  • 104
  • +0/-0
Re: Conseil pour le(s) dev(s) smeserver sur la programmation Shell
« Reply #5 on: December 11, 2014, 07:31:53 PM »
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 :
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 !
« Last Edit: December 11, 2014, 07:35:23 PM by kid_of_leognan »
“When the wise man points to the moon, the fool looks at the finger.”

Offline Stefano

  • *
  • 10,894
  • +3/-0
Re: Conseil pour le(s) dev(s) smeserver sur la programmation Shell
« Reply #6 on: December 11, 2014, 07:58:19 PM »
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..

Quote
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 :

thank you..

Quote
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