# \[Résolu\] Optimisation d'un script bash

**URL:** <https://www.debian-fr.org/t/resolu-optimisation-dun-script-bash/5374>\
**Category:** Programmation\
**Created:** [Février 20, 2016, 3:19 UTC](https://www.debian-fr.org/t/resolu-optimisation-dun-script-bash/5374 "2016-02-20T15:19:48Z")\
**Posts on this page:** 14\
**Page:** 1

<div class="post-metadata">

**Author:** ![Ashgenesis](https://www.debian-fr.org/letter_avatar_proxy/v4/letter/a/57b2e6/32.png) [@Ashgenesis](https://www.debian-fr.org/u/Ashgenesis)\
**Post date:** [Février 20, 2016, 3:19 UTC](https://www.debian-fr.org/t/resolu-optimisation-dun-script-bash/5374/1 "2016-02-20T15:19:48Z")

</div>

`#!/bin/sh
if [$(macommande)]; then
	xmessage -center $(macommande) fonctionne&
fi`  
Le probleme c’est qui dans cette configuration je repete deux fois la commande car j’ai besoin du résultat de cette commande pour l’afficher mais je dois savoir si elle fonctionne.

Je pensais donc dans la condition mettre le résultat dans une variable mais ca ne fonctionne pas.

Vous auriez une idée pour avoir un script qui fonctionne du genre

`#!/bin/sh
if [$(mavariable=macommande)]; then
	xmessage -center $mavariable fonctionne&
fi`

---

<div class="post-metadata">

**Author:** ![fran.b](https://www.debian-fr.org/letter_avatar_proxy/v4/letter/f/d78d45/32.png) [@fran.b](https://www.debian-fr.org/u/fran.b)\
**Post date:** [Février 20, 2016, 3:19 UTC](https://www.debian-fr.org/t/resolu-optimisation-dun-script-bash/5374/2 "2016-02-20T15:19:48Z")

</div>

`#!/bin/sh
RES=$(macommande)
if [$RES]; then
   xmessage -center $RES fonctionne&
fi
`  
Non?

---

<div class="post-metadata">

**Author:** ![Ashgenesis](https://www.debian-fr.org/letter_avatar_proxy/v4/letter/a/57b2e6/32.png) [@Ashgenesis](https://www.debian-fr.org/u/Ashgenesis)\
**Post date:** [Février 20, 2016, 3:19 UTC](https://www.debian-fr.org/t/resolu-optimisation-dun-script-bash/5374/3 "2016-02-20T15:19:48Z")

</div>

Ben ca fonctionne, au niveau optimisation de code c’est bon par contre il met plus de temps à l’exécution. J’ai l’impression que la commande est répété à chaque fois que je demande $var

En tous cas merci pour la solution, 😉 je ne vois vraiment pas pourquoi je n’y ai pas pensé 👿

---

<div class="post-metadata">

**Author:** ![fran.b](https://www.debian-fr.org/letter_avatar_proxy/v4/letter/f/d78d45/32.png) [@fran.b](https://www.debian-fr.org/u/fran.b)\
**Post date:** [Février 20, 2016, 3:19 UTC](https://www.debian-fr.org/t/resolu-optimisation-dun-script-bash/5374/4 "2016-02-20T15:19:50Z")

</div>

`#!/bin/sh
echo > res
TOTO=$(echo blop >> res;grep $1 *)
if [$TOTO] ; then
echo $TOTO
else
echo raté
fi
cat res`et à l’eécution

[code]$ ./gre sh  
gre:#!/bin/sh

blop  
$ ./gre gabeu  
raté

blop  
$ [/code]  
Un seul blop à chaque fois donc $TOTO n’est évalué qu’une seule fois.

---

<div class="post-metadata">

**Author:** ![BorisTheButcher](https://www.debian-fr.org/letter_avatar_proxy/v4/letter/b/d6d6ee/32.png) [@BorisTheButcher](https://www.debian-fr.org/u/BorisTheButcher)\
**Post date:** [Février 20, 2016, 3:19 UTC](https://www.debian-fr.org/t/resolu-optimisation-dun-script-bash/5374/5 "2016-02-20T15:19:52Z")

</div>

Je n’ai pas trouvé de benchmark mais dash semble etre plus rapide que bash, donc si ton script est conforme à posix, en changeant la premiere ligne en  
#!/bin/dash  
(et en installant dash)  
Tu peux peut-etre gagner du temps si il y a beaucoup d’appels à des sous-scripts.  
Ex pour le boot, dash est plus rapide:  
[initscripts-ng.alioth.debian.org … able2.html](http://initscripts-ng.alioth.debian.org/soc2006-bootsystem/deliverable2.html)

---

<div class="post-metadata">

**Author:** ![fran.b](https://www.debian-fr.org/letter_avatar_proxy/v4/letter/f/d78d45/32.png) [@fran.b](https://www.debian-fr.org/u/fran.b)\
**Post date:** [Février 20, 2016, 3:19 UTC](https://www.debian-fr.org/t/resolu-optimisation-dun-script-bash/5374/6 "2016-02-20T15:19:53Z")

</div>

Cette manie du rendement… 🙂

---

<div class="post-metadata">

**Author:** ![BorisTheButcher](https://www.debian-fr.org/letter_avatar_proxy/v4/letter/b/d6d6ee/32.png) [@BorisTheButcher](https://www.debian-fr.org/u/BorisTheButcher)\
**Post date:** [Février 20, 2016, 3:19 UTC](https://www.debian-fr.org/t/resolu-optimisation-dun-script-bash/5374/7 "2016-02-20T15:19:53Z")

</div>

Pour le boot, tant que c’est pas au détriment de la lisibilité, ok.  
Mais sinon, je prefere avoir un boot 6 secondes plus lent (periode de mon cycle neuronal 😆) mais compréhensible…

---

<div class="post-metadata">

**Author:** ![ggoodluck47](https://www.debian-fr.org/letter_avatar_proxy/v4/letter/g/c67d28/32.png) [@ggoodluck47](https://www.debian-fr.org/u/ggoodluck47)\
**Post date:** [Février 20, 2016, 3:19 UTC](https://www.debian-fr.org/t/resolu-optimisation-dun-script-bash/5374/8 "2016-02-20T15:19:53Z")

</div>

Salut,

Je sais pas si celà vas plus vite, mais j’en ai ecris moins 🙂

#!/bin/sh  
if [$0]; then  
xmessage -center $0 fonctionne&  
fi

---

<div class="post-metadata">

**Author:** ![mattotop](https://www.debian-fr.org/user_avatar/www.debian-fr.org/mattotop/32/3942_2.png) [@mattotop](https://www.debian-fr.org/u/mattotop)\
**Post date:** [Février 20, 2016, 3:19 UTC](https://www.debian-fr.org/t/resolu-optimisation-dun-script-bash/5374/9 "2016-02-20T15:19:53Z")

</div>

[quote=“BorisTheButcher”]Je n’ai pas trouvé de benchmark mais dash semble etre plus rapide que bash, donc si ton script est conforme à posix, en changeant la premiere ligne en  
#!/bin/dash  
(et en installant dash)  
Tu peux peut-etre gagner du temps si il y a beaucoup d’appels à des sous-scripts.  
Ex pour le boot, dash est plus rapide:  
[initscripts-ng.alioth.debian.org … able2.html](http://initscripts-ng.alioth.debian.org/soc2006-bootsystem/deliverable2.html)[/quote]  
Je confirme que c’est plus rapide, et qu’aprés trois mois d’utilisation de dash comme sh, je n’ai toujours pas eu de prolême à cause de ça.

---

<div class="post-metadata">

**Author:** ![mattotop](https://www.debian-fr.org/user_avatar/www.debian-fr.org/mattotop/32/3942_2.png) [@mattotop](https://www.debian-fr.org/u/mattotop)\
**Post date:** [Février 20, 2016, 3:19 UTC](https://www.debian-fr.org/t/resolu-optimisation-dun-script-bash/5374/10 "2016-02-20T15:19:53Z")

</div>

[quote=“ggoodluck47”]Salut,

Je sais pas si celà vas plus vite, mais j’en ai ecris moins 🙂

#!/bin/sh  
if [$0]; then  
xmessage -center $0 fonctionne&  
fi[/quote]moins de caractères à lire, il y a des chances que tu gagnes une dizaine de ticks au chargement du script 🙂

---

<div class="post-metadata">

**Author:** ![Ashgenesis](https://www.debian-fr.org/letter_avatar_proxy/v4/letter/a/57b2e6/32.png) [@Ashgenesis](https://www.debian-fr.org/u/Ashgenesis)\
**Post date:** [Février 20, 2016, 3:19 UTC](https://www.debian-fr.org/t/resolu-optimisation-dun-script-bash/5374/11 "2016-02-20T15:19:57Z")

</div>

Merci pour toutes ces réponses

Le probleme avec ton script ggoodluck47 c’est que l’on doit passer en parametre la commande que l’on veux executer et c’est ce que je souhaiterais évité.

Ceci n’est en plus qu’une partie d’un script que je commence seulement c’est pourquoi j’aimerais l’optimiser au maximum afin d’éviter des cycles et aussi des instructions inutiles.

Avec `#!/bin/sh
RES=$(macommande)
if [$RES]; then
   xmessage -center $RES fonctionne&
fi `Ici d’apres fran.b $RES serait evalué qu’une seule fois le temps d’exécution est de `real 0m2.354s
user 0m2.000s
sys 0m0.240s
`  
Avec ce code

`#!/bin/sh
if [$(macommande)]; then
   xmessage -center $(macommande) fonctionne&
fi`Donc ici normalement la commande est évaluée deux fois mais nous avons un temps d’execution inférieur`real 0m2.198s
user 0m1.940s
sys 0m0.212s
`L’accès au contenu de la variable prendrait tant de temps que ca???

---

<div class="post-metadata">

**Author:** ![mattotop](https://www.debian-fr.org/user_avatar/www.debian-fr.org/mattotop/32/3942_2.png) [@mattotop](https://www.debian-fr.org/u/mattotop)\
**Post date:** [Février 20, 2016, 3:19 UTC](https://www.debian-fr.org/t/resolu-optimisation-dun-script-bash/5374/12 "2016-02-20T15:19:57Z")

</div>

fait une boucle qui lance ton script 200 fois et compares. sur une execution c’est peut être un peu dangereux de juger.  
Sinon le script de ggoodluck ne necessite aucun paramètre: $0 désigne le nom du script lui même, même si ce n’est pas ça que tu veux récupèrer.  
Par ailleurs, lancer deux fois macommande n’est équivalent à stocker le resultat et l’utiliser deux fois que si macommande ne fait pas d’effet de bord.

---

<div class="post-metadata">

**Author:** ![Ashgenesis](https://www.debian-fr.org/letter_avatar_proxy/v4/letter/a/57b2e6/32.png) [@Ashgenesis](https://www.debian-fr.org/u/Ashgenesis)\
**Post date:** [Février 20, 2016, 3:20 UTC](https://www.debian-fr.org/t/resolu-optimisation-dun-script-bash/5374/13 "2016-02-20T15:20:06Z")

</div>

J’ai finis de comparer et effectivement les résultats étaient erronés j’ai bien 2 fois moins de temps avec $var qu’avec la commande directe. Je passe donc à la suite merci.

Sinon qu’entends tu parler par effet de bord d’une commande???

---

<div class="post-metadata">

**Author:** ![mattotop](https://www.debian-fr.org/user_avatar/www.debian-fr.org/mattotop/32/3942_2.png) [@mattotop](https://www.debian-fr.org/u/mattotop)\
**Post date:** [Février 20, 2016, 3:20 UTC](https://www.debian-fr.org/t/resolu-optimisation-dun-script-bash/5374/14 "2016-02-20T15:20:06Z")

</div>

[fr.wikipedia.org/wiki/Effet\_de\_b … matique%29](http://fr.wikipedia.org/wiki/Effet_de_bord_%28informatique%29)  
idéalement toute routine est une boite noire qui prend des arguments et produit un résultat, et laisse le reste de l’univers dans l’état ou elle l’a trouvé.  
reste à trouver la routine ultime qui lance toutes les autres subs, et on peut se demander quels sont les paramètres de cet univers, et à qui profite son résultat. 😆
