Quelle est la différence entre les instructions return
et exit
dans les fonctions BASH par rapport aux codes de sortie?
return
renvoie une valeur provenant d’une fonction. exit
abandonne le shell actuel.
MODIFIER:
Selon votre édition de la question, concernant les codes de sortie, le return
n’a rien à voir avec les codes de sortie. Les codes de sortie sont destinés aux applications / scripts , pas aux fonctions. Donc, à cet égard, le seul mot-clé qui définit le code de sortie du script (celui qui peut être intercepté par le programme appelant à l’aide de la variable shell $?
) Est exit
.
EDIT 2:
Ma dernière exit
référence de déclaration provoque des commentaires. Il a été fait pour différencier return
et exit
pour la compréhension de l’OP, et en fait, à tout moment d’un script de programme / shell, exit
est le seul moyen de terminer le script avec un code de sortie pour le processus appelant.
Chaque commande exécutée dans le shell produit un “code de sortie” local: il définit le $?
variable à ce code, et peut être utilisé avec if
, &&
et d’autres opérateurs pour exécuter conditionnellement d’autres commandes.
Ces codes de sortie (et la valeur de la variable $?
) Sont réinitialisés par chaque exécution de commande.
Incidemment, le code de sortie de la dernière commande exécutée par le script est utilisé comme code de sortie du script lui-même, comme le voit le processus appelant.
Enfin, les fonctions, lorsqu’elles sont appelées, agissent comme des commandes de shell en ce qui concerne les codes de sortie. Le code de sortie de la fonction ( dans la fonction) est défini en utilisant return
. Ainsi, quand une fonction return 0
, l’exécution de la fonction se termine, donnant un code de sortie de 0.
return
provoquera la sortie de la fonction courante, alors que exit
provoquera la fin du script au point où il est appelé. Voici un exemple de programme pour aider à expliquer ceci:
#!/bin/bash retfunc() { echo "this is retfunc()" return 1 } exitfunc() { echo "this is exitfunc()" exit 1 } retfunc echo "We are still here" exitfunc echo "We will never see this"
$ ./test.sh this is retfunc() We are still here this is exitfunc()
Je ne pense pas que quiconque ait vraiment répondu à la question car ils ne décrivent pas comment les deux sont utilisés. OK, je pense que nous soaps que exit tue le script, où qu’il soit appelé et vous pouvez lui assigner un statut tel que exit ou exit 0 ou exit 7 et ainsi de suite. Cela peut être utilisé pour déterminer comment le script a été forcé de s’arrêter s’il était appelé par un autre script, etc.
return lorsqu’elle est appelée renverra la valeur spécifiée pour indiquer le comportement de la fonction, généralement un 1 ou un 0. Par exemple:
#!/bin/bash isdirectory() { if [ -d "$1" ] then return 0 else return 1 fi echo "you will not see anything after the return like this text" }
vérifiez comme ceci:
if isdirectory $1; then echo "is directory"; else echo "not a directory"; fi
ou comme ça:
isdirectory || echo "not a directory"
Dans cet exemple, le test peut être utilisé pour indiquer si le répertoire a été trouvé. remarquez que rien après le retour ne sera exécuté dans la fonction. 0 est vrai mais faux est 1 dans le shell, différent des autres langages.
Pour plus d’informations sur les fonctions: http://www.linuxjournal.com/content/return-values-bash-functions
Remarque: la fonction isdirectory est à des fins pédagogiques uniquement. Cela ne devrait pas être la façon dont vous effectuez une telle option dans un vrai script.
Rappelez-vous que les fonctions sont internes à un script et qu’elles renvoient normalement depuis leur appel à l’aide de l’instruction return. L’appel d’un script externe est une autre affaire et les scripts se terminent généralement par une instruction de sortie.
La différence “entre les instructions de retour et de sortie des fonctions BASH par rapport aux codes de sortie” est très limitée. Les deux renvoient un statut, pas des valeurs en soi. Un état de zéro indique le succès, tandis que tout autre statut (1 à 255) indique un échec. L’instruction return renverra au script d’où elle a été appelée, tandis que l’instruction exit mettra fin à l’intégralité du script où il est rencontré.
return 0 # returns to where the function was called. $? contains 0 (success). return 1 # returns to where the function was called. $? contains 1 (failure). exit 0 # exits the script completely. $? contains 0 (success). exit 1 # exits the script completely. $? contains 1 (failure).
Si votre fonction se termine simplement sans instruction de retour, le statut de la dernière commande exécutée est renvoyé en tant que code de statut (et sera placé dans $?
).
Rappelez-vous que return and exit renvoie un code d’état de 0 à 255, disponible en $?
. Vous ne pouvez rien insérer dans un code de statut (par exemple, retourner “chat”); ça ne marchera pas. Mais, un script peut transmettre 255 raisons d’échec différentes en utilisant des codes d’état.
Vous pouvez définir des variables contenues dans le script appelant, ou les résultats d’écho dans la fonction et utiliser la substitution de commandes dans le script appelant; mais le but du retour et de la sortie est de transmettre les codes de statut, et non les valeurs ou les résultats de calcul, comme on pourrait s’y attendre dans un langage de programmation tel que C.
Parfois, vous exécutez un script en utilisant .
ou source
.
. a.sh
Si vous incluez une exit
dans le a.sh
, cela ne terminera pas le script, mais mettra fin à votre session shell.
Si vous incluez un return
dans le a.sh
, il arrête simplement de traiter le script.
En termes simples (principalement pour les débutants en codage), nous pouvons dire,
`return` : exits the function, `exit()` : exits the program(called as process while running)
Aussi si vous avez observé, c’est très basique mais …,
`return` : is the keyword `exit()` : is the function
exit
terminer le processus en cours ; avec ou sans code de sortie, considérez ceci comme un système plus qu’une fonction de programme. Notez que lorsque le sourcing se fait, exit
mettra fin au shell, cependant, en cours d’exécution, il vous suffira de exit
le script.
return
d’une fonction retour à l’instruction après l’appel, avec ou sans code retour. return
est facultatif et implicite à la fin de la fonction. return
ne peut être utilisé que dans une fonction.
Je veux append que lors de la sélection, il n’est pas facile de exit
le script depuis une fonction sans tuer le shell. Je pense qu’un exemple vaut mieux sur un script “test”
#!/bin/bash function die(){ echo ${1:=Something terrible wrong happen} #... clean your trash exit 1 } [ -f /whatever/ ] || die "whatever is not available" # now we can proceed echo "continue"
faire ce qui suit:
user$ ./test Whatever is not available user$
test
-et- le shell va se fermer.
user$ . ./test Whatever is not available
seul le test
sera terminé et l’invite apparaîtra.
La solution consiste à inclure la procédure potentielle dans (
et )
#!/bin/bash function die(){ echo $(1:=Something terrible wrong happen) #... clean your trash exit 1 } ( # added [ -f /whatever/ ] || die "whatever is not available" # now we can proceed echo "continue" ) # added
maintenant, dans les deux cas, seul le test
sortira.
Tout d’abord, return
est un mot-clé et exit
mon ami est une fonction.
Cela dit, voici une des explications les plus simples.
return
Renvoie une valeur provenant d’une fonction.
exit
Il quitte ou abandonne le shell actuel.
La question du PO: Quelle est la différence entre les instructions return et exit dans les fonctions BASH par rapport aux codes de sortie?
Tout d’abord, des éclaircissements sont requirejs:
Dans la liste de puces ci-dessus, choisissez “(x | y)” soit toujours le premier élément, soit toujours le deuxième élément pour obtenir des instructions sur les fonctions & return ou shells & exit respectivement.
Ce qui est clair, c’est qu’ils partagent tous deux l’usage commun de la variable spéciale $? pour passer des valeurs vers le haut après leur fin.
* Maintenant pour les manières spéciales que $? peut être mis en place:
Il vaut la peine de noter que $? peut être assigné une valeur en appelant exit dans un sous-shell, comme ceci:
# (exit 259) # echo $? 3