Shell > Contourner des Exit de sous procédure

Résolu/Fermé
Zmon - Modifié le 8 sept. 2017 à 13:30
Zmon Messages postés 9 Date d'inscription mercredi 5 juin 2013 Statut Membre Dernière intervention 14 septembre 2017 - 14 sept. 2017 à 14:41
Bonjour,

Je vais essayer d'expliquer le plus clairement possible ma problématique !

Je suis en train de développer un shell, disons qu'il s'appelle PROGPRINCIPAL.

Dans celui ci, je lance un autre shell : SOUSPROG
Ce dernier lance plusieurs autres shells : CALCUL1, CALCUL2 etc.
et après chacun de ces calculs il lance un shell : CONTROL.

Dans ce dernier shell (CONTROL), s'il y a eu une erreur, on fait un exit :
     if [ $? = 0 ]
then
exit 1
fi


On a donc en résumé une arborescence de ce type :

> PROGPRINCIPAL
>> SOUSPROG
>>> CALCUL1
>>> CONTROL
>>>> if [ $? = 0 ] then exit 1
>>> CALCUL2
>>> CONTROL
>>>> if [ $? = 0 ] then exit 1
etc...


Le problème est le suivant :
J'aimerais, lorsqu'il y a un exit 1, que ça ne me fasse pas quitter toute la chaîne mais que ça me ramène dans le PROGPRINCIPAL (ou dans la chaîne SOUSPROG à la limite, tant que ça ne quitte pas toute la procédure) et pouvoir récupérer l'info disant qu'il y a eu une erreur, pour en définitive lancer un SOUSPROG2.

Donc si je reprend le schéma ci dessus

> PROGPRINCIPAL
>> SOUSPROG
>>> CALCUL1
>>> CONTROL
>>>> if [ $? = 0 ] then exit 1
>>> CALCUL2
>>> CONTROL
>>>> if [ $? = 0 ] then exit 1
etc...
>> S'il y a eu une erreur > SOUSPROG2

Si quelqu'un a une idée pour résoudre mon problème ce serait avec plaisir que je lirais votre réponse !! :)


Si ce n'est pas clair j'essayerais d'être plus précis.

D'avance merci, ne serait ce que pour avoir lu le problème !

Zmon

1 réponse

zipe31 Messages postés 36402 Date d'inscription dimanche 7 novembre 2010 Statut Contributeur Dernière intervention 27 janvier 2021 6 407
8 sept. 2017 à 16:00
Salut,

Normalement la commande
return
en lieu et place de
exit
devrait faire le job ;-)

man bash
pour plus de détails ou :

$ help return
return: return [n]
Termine depuis une fonction du shell.

Entraine l'arrêt d'une fonction ou d'un script sourcé, avec le code de retour spécifié par N.
Si N est omis, le code de retour est celui de la dernière commande exécutée
à l'intérieur de la fonction ou du script

Code de retour :
Renvoie N ou le code d'échec si le shell n'est pas en train d'exécuter une fonction ou un script.

0
Salut,

Merci pour ta réponse.

Effectivement si ça ne tenait qu'à moi j'aurais remplacé les exit par des return dans le shell CONTROL, malheureusement je ne peux pas toucher aux shells autre que PROGPRINCIPAL.

J'aurais aimé savoir s'il existe une commande qui permet par exemple d'interdire l'exécution des "exit" aux shells fils qui seront lancés (et à leurs fils), ou une solution de ce genre, en ne touchant donc qu'à mon PROGPRINCIPAL.

Et si en plus de cela il existe une solution qui me permet quand même de savoir s'il y a eu une erreur dans les shells fils dans mon PROGPRINCIPAL, ce serait la perfection ! :)
0
zipe31 Messages postés 36402 Date d'inscription dimanche 7 novembre 2010 Statut Contributeur Dernière intervention 27 janvier 2021 6 407 > Zmon
8 sept. 2017 à 16:38
Comment est appelé le shell CONTROL depuis ton PROGPRINCIPAL ?
0
CONTROL est appelé dans SOUSPROG, lui même appelé dans PROGPRINCIPAL

plus précisément, PROGPRINCIPAL lance SOUSPROG, et ce dernier lance à la suite CALCUL1, CONTROL, CALCUL2, CONTROL etc.
0
zipe31 Messages postés 36402 Date d'inscription dimanche 7 novembre 2010 Statut Contributeur Dernière intervention 27 janvier 2021 6 407 > Zmon
8 sept. 2017 à 16:46
Euh… ce que je voulais savoir c'est comment il est appelé ;-\

Est-ce que le programme est sourcé (
. CONTROL
) ou simplement appelé (
./CONTROL
) ?
0
Il est sourcé :
. chemin/CONTROL
0