SH : redirection et détection d'erreur

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 :

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 :slightly_smiling:
Duna

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é $

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é :smiley:

Merci encore !

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.