#1 Le 22/03/2021, à 00:09
- Tawal
[Résolu] Exit dans Fonction ou après Appel
Hello,
Lequel de ces deux cas est le plus correct ?
erreur() {
echo "Erreur"
exit 1
}
erreur
ou
erreur() {
echo "Erreur"
}
erreur
exit 1
Les 2 fonctionnent.
Mais j'ai le sentiment que le 2ième exemple est meilleur.
Juste un sentiment, pas de certitude, ni d'argumentation ...
En vous remerciant.
Edit:
Un début d'argumentation :
Si un appel de fonction peut se considérer comme une insertion du code (de la fonction) en lieu et place de son appel alors le 1er exemple est tout aussi correct.
Donc les 2 se vaudraient et ce serait selon la nécessité.
Dernière modification par Tawal (Le 22/03/2021, à 02:02)
Le savoir n'a d’intérêt que si on le transmet.
Useless Use of Cat Award
Filenames and Pathnames in Shell: How to do it Correctly
À chaque problème sa solution, à chaque solution son moyen, si pas de moyen, toujours le problème !
Hors ligne
#2 Le 22/03/2021, à 00:25
- Watael
Re : [Résolu] Exit dans Fonction ou après Appel
Lequel de ces deux cas est le plus correct ?
ça dépend de ce que tu veux faire.
soit quitter le script avec un code d'erreur à la fin de l'appel de la fonction erreur,
soit quitter le script avec un code d'erreur après avoir appelé la fonction erreur.
Connected \o/
Welcome to sHell. · eval is evil.
Hors ligne
#3 Le 22/03/2021, à 00:42
- Tawal
Re : [Résolu] Exit dans Fonction ou après Appel
En fait, cette fonction est appelée plusieurs fois.
Et le code d'erreur est toujours le même.
Donc, dans ce cas, je peux rapatrier les exit dans la fonction, si je comprends bien.
Après, avec ton éclaircissement, je comprends l'utilité de le placer après l'appel pour gérer différents codes d'erreur.
Merci de ta réponse rapide
Edit:
Y-a-t-il une autre différence à quitter le script dans une fonction ou dans le corps ?
Dernière modification par Tawal (Le 22/03/2021, à 00:46)
Le savoir n'a d’intérêt que si on le transmet.
Useless Use of Cat Award
Filenames and Pathnames in Shell: How to do it Correctly
À chaque problème sa solution, à chaque solution son moyen, si pas de moyen, toujours le problème !
Hors ligne
#4 Le 22/03/2021, à 00:50
- jplemoine
Re : [Résolu] Exit dans Fonction ou après Appel
Et surtout : quel est l’intérêt de renvoyer un code d'erreur s'il n'est pas testé....
Ce serait plus un truc comme ça :
# fonction de test de machin bidule
machin() {
ret=$(ls -ld *)
if [ "$ret" = "xxx" ]; then
echo "Erreur"
exit 1
fi
exit 0
}
# pgm principal
retour=machin()
... retour vaut 0 si ok : 1 si erreur
Dernière modification par jplemoine (Le 22/03/2021, à 00:51)
Ce compte ne servira plus : vous pouvez le supprimer si le coeur vous en dit...
Laissé par l'auteur pour historique.
Hors ligne
#5 Le 22/03/2021, à 00:56
- Watael
Re : [Résolu] Exit dans Fonction ou après Appel
err()
{
errCode=$1; shift
>&2 echo "err: $@"
exit $errCode
}
true || err 1 "vrai : ne sera pas exécuté"
false || err 2 "faux : sera exécuté. :)"
Connected \o/
Welcome to sHell. · eval is evil.
Hors ligne
#6 Le 22/03/2021, à 00:57
- Tawal
Re : [Résolu] Exit dans Fonction ou après Appel
Les tests se font (dans mon cas) en amont de l'appel de la fonction.
Edit:
Intéressant ton code Watael
Dernière modification par Tawal (Le 22/03/2021, à 01:01)
Le savoir n'a d’intérêt que si on le transmet.
Useless Use of Cat Award
Filenames and Pathnames in Shell: How to do it Correctly
À chaque problème sa solution, à chaque solution son moyen, si pas de moyen, toujours le problème !
Hors ligne
#7 Le 22/03/2021, à 01:11
- Tawal
Re : [Résolu] Exit dans Fonction ou après Appel
Du coup, on est bien d'accord que c'est au choix du "scripteur" et de l'utilité que dépend le placement de l'exit.
Le savoir n'a d’intérêt que si on le transmet.
Useless Use of Cat Award
Filenames and Pathnames in Shell: How to do it Correctly
À chaque problème sa solution, à chaque solution son moyen, si pas de moyen, toujours le problème !
Hors ligne
#8 Le 22/03/2021, à 01:31
- Watael
Re : [Résolu] Exit dans Fonction ou après Appel
si tu as une fonction dont la tâche est de sortir du script, alors la sortie doit faire partie de la fonction !
Connected \o/
Welcome to sHell. · eval is evil.
Hors ligne
#9 Le 22/03/2021, à 01:44
- kamaris
Re : [Résolu] Exit dans Fonction ou après Appel
Une fonction devrait-elle avoir cette tâche ?
Elle peut l'avoir, certes, comme on peut mettre des variables globales au lieu de faire de vraies fonctions.
Personnellement, je préfère en général utiliser return dans une fonction, la tâche de terminer ou non le script revenant au script lui-même.
Dernière modification par kamaris (Le 22/03/2021, à 01:50)
Hors ligne
#10 Le 22/03/2021, à 01:55
- Watael
Re : [Résolu] Exit dans Fonction ou après Appel
false || errFonc || exit
???
Connected \o/
Welcome to sHell. · eval is evil.
Hors ligne
#11 Le 22/03/2021, à 02:14
- kamaris
Re : [Résolu] Exit dans Fonction ou après Appel
Oui, si jamais rien ne doit s'intercaler entre errFonc et exit, et que errFonc est très simple, alors pourquoi pas.
Mais en général (j'ai édité mon message ci-dessus pour rajouter cette précision) je préfère voir un script sortir au « niveau 0 », et ne pas avoir des exit disséminés dans des fonctions, plus ou moins profondément.
Hors ligne
#12 Le 22/03/2021, à 02:18
- Tawal
Re : [Résolu] Exit dans Fonction ou après Appel
Une fonction devrait-elle avoir cette tâche ?
Tout dépend de la notion de "tâche".
Mais, sinon, je pense que oui, qu'elle soit dédiée au test ou à une action.
tu préfères cette écriture
err() {
echo "Erreur"
}
case $erreur in
a) err
exit 1
;;
b) err
exit 2
;;
esac
à
err() {
echo "Erreur" 1>&2
exit $1
}
case $erreur in
a) err 1 ;;
b) err 2 ;;
esac
Dernière modification par Tawal (Le 22/03/2021, à 02:19)
Le savoir n'a d’intérêt que si on le transmet.
Useless Use of Cat Award
Filenames and Pathnames in Shell: How to do it Correctly
À chaque problème sa solution, à chaque solution son moyen, si pas de moyen, toujours le problème !
Hors ligne
#13 Le 22/03/2021, à 05:30
- Watael
Re : [Résolu] Exit dans Fonction ou après Appel
ne pas avoir des exit disséminés dans des fonctions,
tout à fait.
je ne l'ai pas explicité, mais il doit n'y avoir aucun doute qu'il n'y a qu'une seule fonction qui "gère" la sortie, pour éviter de répéter le même code à différents endroits du script.
@Tawal: je vote pour la deuxième proposition.
on peut même "améliorer"* la fonction en la nommant de manière plus évocatrice errQuit, ou errXit.
--
*
Connected \o/
Welcome to sHell. · eval is evil.
Hors ligne
#14 Le 22/03/2021, à 07:47
- serged
Re : [Résolu] Exit dans Fonction ou après Appel
Comme dit le proverbe :
First rule of programming : If it works don't touch anything.
LinuxMint Vera Cinnamon et d'autres machines en MATE, XFCE... 20.x , 21.x ou 19.x
Tour : Asus F2A55 / AMD A8-5600K APU 3,6GHz / RAM 16Go / Nvidia GeForce GT610 / LM21.1 Cinnamon
Portable : LDLC Mercure MH : Celeron N3450 /RAM 4Go / Intel HD graphics 500 i915 / biboot Win 10 (sur SSD) - LM21.1 MATE (sur HDD)
Hors ligne
#15 Le 22/03/2021, à 07:54
- Watael
Re : [Résolu] Exit dans Fonction ou après Appel
hmmm.
les usines à gaz, ça marche, mais il faut pourtant les réformer.
Connected \o/
Welcome to sHell. · eval is evil.
Hors ligne
#16 Le 22/03/2021, à 13:02
- Tawal
Re : [Résolu] Exit dans Fonction ou après Appel
@Tawal: je vote pour la deuxième proposition.
on peut même "améliorer"* la fonction en la nommant de manière plus évocatrice errQuit, ou errXit.
Je résume :
L'exit dans la fonction oui si c'est la seule fonction à pouvoir quitter le script.
Sinon, traitement dans le corps.
On vient de me dire qu'une fonction (comme un script) ne devrait servir qu'à une chose. Or, ma fonction affiche l'erreur ET quitte le script. J'ai répondu que la "tâche" de ma fonction était de gérer la sortie du script par l'erreur (une seule tâche et l'erreur est avérée avant son appel).
@Watael: je prends note de la clarification dans le nommage de la fonction
Ces précisions peuvent paraître futiles, mais elles sont essentielles à une bonne base de construction à mon avis.
Merci à vous.
Edit :
les usines à gaz, ça marche, mais il faut pourtant les réformer.
J'en ai fait quelques unes et je voudrais absolument éviter de les reproduire. Merci
Dernière modification par Tawal (Le 22/03/2021, à 13:05)
Le savoir n'a d’intérêt que si on le transmet.
Useless Use of Cat Award
Filenames and Pathnames in Shell: How to do it Correctly
À chaque problème sa solution, à chaque solution son moyen, si pas de moyen, toujours le problème !
Hors ligne
#17 Le 22/03/2021, à 16:04
- kamaris
Re : [Résolu] Exit dans Fonction ou après Appel
tu préfères cette écriture
err() { echo "Erreur" } case $erreur in a) err exit 1 ;; b) err exit 2 ;; esac
à
err() { echo "Erreur" 1>&2 exit $1 } case $erreur in a) err 1 ;; b) err 2 ;; esac
Je crois que tout a été dit (notamment dans les commentaires ajoutés depuis ma réponse d'hier soir), mais je dirais que même comme ça, la première formulation ne me dérange pas.
D'autant que c'est un peu artificiel, car ça pourrait s'écrire
echo "Erreur"
case $erreur in
a) exit 1 ;;
b) exit 2 ;;
esac
Et puis, dans un tel cas, on pourrait fort bien avoir un message différent selon l'erreur, et donc oublier la fonction de sortie pour tout gérer dans le case.
Bref, ça dépend des configurations, mais si on est d'accord sur le fait de ne pas éparpiller les points de sortie dans le script, c'est le principal
Dernière modification par kamaris (Le 22/03/2021, à 16:05)
Hors ligne
#18 Le 22/03/2021, à 17:01
- Tawal
Re : [Résolu] Exit dans Fonction ou après Appel
Bref, ça dépend des configurations, mais si on est d'accord sur le fait de ne pas éparpiller les points de sortie dans le script, c'est le principal
C'est un peu ce que je voulais savoir. Et vos explications sont assez claires pour moi.
Pour mon cas d'application, la seule autre sortie (normale) du script se fait ... à la fin.
Je suis d'accord avec toi sur la forme, les exemples donnés (par moi) ne sont que des principes.
Et je m'aperçois, au travers de cette discussion, qu'il me manque un peu de vision sur les possibilités de faire les choses avec concision.
Merci beaucoup, ça n'a l'air de rien, mais j'apprends énormément grâce à vous
Le savoir n'a d’intérêt que si on le transmet.
Useless Use of Cat Award
Filenames and Pathnames in Shell: How to do it Correctly
À chaque problème sa solution, à chaque solution son moyen, si pas de moyen, toujours le problème !
Hors ligne
#19 Le 22/03/2021, à 17:58
- erresse
Re : [Résolu] Exit dans Fonction ou après Appel
Je peux préciser quelque chose ?
Un "exit", avec ou sans code retour, met fin au "script" lorsqu'il est exécuté, alors que "return" avec ou sans code retour, ne met fin qu'à la "fonction" dans laquelle il est codé, à charge du script principal de sortir par exit ou pas selon le degré de sévérité de l'erreur...
Pas ton avis, Watael ?
Plus de 50 ans d'informatique, ça en fait des lignes de commandes en console, mais on n'avait pas le choix...
Excellente raison pour, aujourd'hui qu'on le peut, utiliser au maximum les INTERFACES GRAPHIQUES !
Important : Une fois le problème solutionné, pensez à clore votre sujet en ajoutant [Résolu] devant le titre du 1er message, et un bref récapitulatif de la solution à la fin de celui-ci. Merci.
Hors ligne
#20 Le 22/03/2021, à 19:03
- Tawal
Re : [Résolu] Exit dans Fonction ou après Appel
Je peux préciser quelque chose ?
Évidemment ! On est libre sur du libre
J'entends tes propos.
Et ils sont fondés, je dirais.
Mais, comme je l'indiquais au #16, dans mon cas, l'erreur est avérée (testée) avant l'appel de la fonction.
Et toutes les erreurs menant à l'appel de cette fonction demandent un arrêt du script (conception).
Du coup, pas besoin de "peser" la gravité de l'erreur (encore dans mon cas).
Mais en effet, ce que tu soulignes, est intéressant et rejoint un peu les dires de kamaris au #9.
Le savoir n'a d’intérêt que si on le transmet.
Useless Use of Cat Award
Filenames and Pathnames in Shell: How to do it Correctly
À chaque problème sa solution, à chaque solution son moyen, si pas de moyen, toujours le problème !
Hors ligne
#21 Le 22/03/2021, à 19:12
- jplemoine
Re : [Résolu] Exit dans Fonction ou après Appel
Une fonction ne doit pas faire sortir du script car si, lors d'une modification future, tu ajoutes du code, ce sera du code "mort" (jamais appelé).
Ça donne un truc dans ce genre.
...
fonction Appel fonction()
...
traitement éventuel
....
if erreur1
affiche erreur1
renvoi erreur
fin si
....
if erreur2
affiche erreur2
renvoi erreur
fin si
renvoi ok
fin fonction
---- code principal ------
code_retour=Appel fonction()
if code_retour=erreur
on quitte
sinon
on continue
fin si
Ce compte ne servira plus : vous pouvez le supprimer si le coeur vous en dit...
Laissé par l'auteur pour historique.
Hors ligne
#22 Le 22/03/2021, à 23:27
- Watael
Re : [Résolu] Exit dans Fonction ou après Appel
il faut être clair.
il peut y avoir UNE fonction dont la tâche est d'interrompre le script,
il n'a jamais été question de mettre des exit dans plusieurs fonctions.
il y a une fonction errQuit()
- parce qu'on veut que la sortie soit paramétrable (indication "conditionnelle" du code de sortie, et/ou d'un message explicatif...)
- pour ne pas taper plusieurs fois les mêmes commandes (c'est source d'erreurs, et c'est rébarbatif)
on l'a vu : on ne dissémine pas les exit dans des fonctions.
à un moment, on sait ce qu'on a codé, sinon on a lu et compris le code avant de le modifier
et quand ça ne fait pas, ou plus, ce qui est prévu, quand «ça marche plus», et bien on debug !
Dernière modification par Watael (Le 23/03/2021, à 08:16)
Connected \o/
Welcome to sHell. · eval is evil.
Hors ligne
#23 Le 23/03/2021, à 07:32
- Tawal
Re : [Résolu] Exit dans Fonction ou après Appel
Nickel ! Quoi de plus clair !
Le savoir n'a d’intérêt que si on le transmet.
Useless Use of Cat Award
Filenames and Pathnames in Shell: How to do it Correctly
À chaque problème sa solution, à chaque solution son moyen, si pas de moyen, toujours le problème !
Hors ligne