# SH : redirection et détection d'erreur

**URL:** <https://www.debian-fr.org/t/sh-redirection-et-detection-derreur/66289>\
**Category:** Programmation\
**Created:** [Février 21, 2016, 9:45 UTC](https://www.debian-fr.org/t/sh-redirection-et-detection-derreur/66289 "2016-02-21T21:45:02Z")\
**Posts on this page:** 4\
**Page:** 1

<div class="post-metadata">

**Author:** ![Dunatotatos](https://www.debian-fr.org/letter_avatar_proxy/v4/letter/d/c2a13f/32.png) [@Dunatotatos](https://www.debian-fr.org/u/Dunatotatos)\
**Post date:** [Février 21, 2016, 9:45 UTC](https://www.debian-fr.org/t/sh-redirection-et-detection-derreur/66289/1 "2016-02-21T21:45:02Z")

</div>

Salut à tous,

Je souhaite écrire un script sh qui détecte si Python 2 est installé. Voici ce que j’ai pour le moment :

[code]#!/bin/sh  
{  
# Vérifie que Python est installé  
python --version

```
# Vérifie que c'est bien Python2
[`python -c 'import sys; print(sys.version_info[0])'` = '2' ]

```

} || {  
echo "Please, install Python 2"  
exit 1  
}  
exit 0[/code]  
Ce script me donne le résultat escompté dans tous les cas (Python 2 et 3 installés, Python 3 seulement, ou pas de Python du tout). Le seul souci est que la première ligne (python2 --version) affiche la version de Python sur la sortie d’erreur standard. Oui oui, même quand il n’y a pas d’erreur, la version est affichée sur stderr. Du coup, c’est un peu moche. J’ai souhaité cacher cette sortie en redirigeant l’erreur :

```auto

```

Le script n’affiche plus rien sur la console, mais si python2 n’est pas installé, l’erreur est ignorée et mon script sort avec l’état 0.

J’utilise la solution suivante :

`#!/bin/sh
python2 --version 2> /dev/null
if [$? != 0]
then
    echo "Please, install Python 2"
    exit 1
fi
exit 0`  
Ça fonctionne très bien, mais je voudrais comprendre pourquoi ma première idée ne fonctionne pas, et comment parvenir à rediriger un message d’erreur sans l’ignorer.

D’avance, merci pour votre aide 🙂  
Duna

---

<div class="post-metadata">

**Author:** ![Watael](https://www.debian-fr.org/letter_avatar_proxy/v4/letter/w/a4c791/32.png) [@Watael](https://www.debian-fr.org/u/Watael)\
**Post date:** [Février 21, 2016, 9:45 UTC](https://www.debian-fr.org/t/sh-redirection-et-detection-derreur/66289/2 "2016-02-21T21:45:06Z")

</div>

salut,

dans le premier script, ce n’est pas la demande d’affichage de la version qui décide de la suite du script.  
c’est la dernière commande de la liste :`$ { false; true;} || echo false # vrai, donc le OU n'est pas exécuté
$`ou`$ { true; false;} && echo true # faux, donc le ET n'est pas exécuté
$`

---

<div class="post-metadata">

**Author:** ![Dunatotatos](https://www.debian-fr.org/letter_avatar_proxy/v4/letter/d/c2a13f/32.png) [@Dunatotatos](https://www.debian-fr.org/u/Dunatotatos)\
**Post date:** [Février 21, 2016, 9:45 UTC](https://www.debian-fr.org/t/sh-redirection-et-detection-derreur/66289/3 "2016-02-21T21:45:06Z")

</div>

Effectivement, j’ai oublié une partie. Merci !

La version correcte est donc :

[code]#!/bin/sh  
{  
# Vérifie que Python est installé  
python --version \>\> /dev/null 2\>&1 &&

```
# Vérifie que c'est bien Python2
[`python -c 'import sys; print(sys.version_info[0])'` = '2' ]

```

} || {  
echo "Please, install Python 2"  
exit 1  
}  
exit 0[/code]

Testé et approuvé 😃

Merci encore !

---

<div class="post-metadata">

**Author:** ![seb-ksl](https://www.debian-fr.org/user_avatar/www.debian-fr.org/seb-ksl/32/2946_2.png) [@seb-ksl](https://www.debian-fr.org/u/seb-ksl)\
**Post date:** [Février 21, 2016, 9:45 UTC](https://www.debian-fr.org/t/sh-redirection-et-detection-derreur/66289/4 "2016-02-21T21:45:07Z")

</div>

Note que sur une “vieille” version de Python 2, tu récupèreras une erreur à cause du print sous forme fonction au lieu de statement.

Édit: après test, apparemment non ?  
Édit2: OK compris, en fait comme c’est évalué right-to-left et que mono == expr[/mono], [mono]print(expr) == print expr[/mono] en Python 2. Mea culpa.
