La différence entre le retour et la sortie dans Bash fonctions
Quelle est la différence entre le return
et exit
déclaration en Bash fonctions en ce qui concerne les codes de sortie?
- Protip: type
help <command>
dans votre shell pour obtenir des informations sur ce qu'est une commande interne du shell va faire. Dans votre cashelp return
ethelp exit
Vous devez vous connecter pour publier un commentaire.
De
man bash
surreturn [n]
;... sur
exit [n]
:EDIT:
Que par votre travail d'édition de la question, concernant les codes de sortie,
return
n'a rien à voir avec les codes de sortie. Codes de sortie sont destinés à applications/scripts, pas de fonctions. Donc, à cet égard, le seul mot clé qui définit le code de sortie du script (celui qui peut être pris par le programme appelant à l'aide de la$?
variable shell) estexit
.EDIT 2:
Ma dernière déclaration en référence
exit
est à l'origine de certains commentaires. Elle a été faite pour différencierreturn
etexit
pour la compréhension de l'OP, et en fait, à tout point donné d'un programme/script shell,exit
est la seule manière d'en finir avec le script avec un code de sortie du processus appelant.Chaque commande exécutée dans le shell produit local "code de sortie": il définit les
$?
variable de ce code, et peut être utilisé avecif
,&&
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 à chaque exécution de la commande.D'ailleurs, 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 on le voit par le processus appelant.
Enfin, les fonctions, lorsqu'il est appelé, agissent comme des commandes shell à l'égard des codes de sortie. Le code de sortie de la fonction (dans la fonction) est définie à l'aide de
return
. Ainsi, lorsque dans une fonctionreturn 0
est exécuté, l'exécution de la fonction se termine, donnant un code de sortie 0.func(){ return 50; };func;echo $?
échos 50. Ainsi, le$?
variable d'environnement ne semble pas être limitée àexit
.$?
Se développe pour l'état de sortie de la plus récente exécuté premier plan pipeline". Cette sortie peut être de la coque sous la forme d'un appel àexit
(ou de frapper la fin du script) ou sous la forme d'un appel àreturn
au sein d'une fonction.$?
le processus actuel/script est limitée soit à laexit
ou au résultat de la dernière commande exécutée par ce script. Donc, si votre dernière ligne du script est l'appel à cette fonction, et que cette fonction renvoie 50, oui, le$?
que vous produisez pour le processus qui vous a appelés est de 50. Cependant, cela ne veut pas avoir à faire avec lareturn
, parce que c'est limité au script courant. Il arrive à être retournés que si cet appel de fonction est la dernière phrase du script.exit
, cependant, il faut toujours terminer le script et le retour de cette valeur comme$?
le processus appelant.return
n'a rien à voir avec les codes de sortie." L'expérimentation me dit qu'il n'y a pas de différence fonctionnelle entre le code de retour d'une fonction et le code de sortie d'un script.return
ne définissez le code de sortie pour le script si la fonction est la dernière commande exécutée dans le script, la documentation définit clairement le "statut de sortie" à être définies pour les fonctions.set -o pipefail
- c'est ce dont j'avais besoin dans mon script.$?
dans le contexte de la enfermant script, et si un appel à une fonction shell est la dernière opération dans un script, la fonction de la valeur de retour sera le statut de sortie du script.do_junk() { ls /tmp/bleedledorf 2>/dev/null; } ; do_junk && echo found
retournera rien.do_junk() { ls /tmp/bleedledorf 2>/dev/null; return 0; }; do_junk && echo found
sera de retour trouvéreturn
sera la cause de la fonction en cours pour aller hors de portée, alors queexit
va provoquer le script pour mettre fin à l'endroit où elle est appelée. Voici un exemple de programme pour aider à expliquer ce:De sortie
$?
.echo fnord | while read x; do exitfunc; done; echo "still here"
imprimé "toujours là". Il semble que seule lawhile
sous-shell est quitté dans ce scénario.done || exit $?
mais c'est laid et pas exactement équivalent.exit
prendra fin le shell courant. Dans votre exemple, le tuyau créé un shell interne est exécuté de laquelle la boucle while s'exécute. Pour éviter que le shell interne est exécuté et obtenir la même fonctionnalité, vous pouvez utiliser le processus de substitutionwhile read x; do exitfunc; done < <(echo fnord); echo "still here"
return
sera la cause de la fonction en cours ou issus du script pour aller hors de la portée``.Je ne pense pas que quelqu'un a vraiment bien répondu à la question parce qu'ils ne décrivent pas comment les deux sont utilisés. OK je crois que nous savons que la sortie tue le script, si jamais on l'appelle, et vous pouvez attribuer un statut à elle aussi bien comme sortie ou de sortie 0 ou à la sortie 7 et ainsi de suite. Ceci peut être utilisé pour déterminer la façon dont le script a été forcé de s'arrêter si on l'appelle par un autre script, etc. Assez à la sortie.
retour lorsque l'appel sera de retour à la valeur spécifiée pour indiquer la fonction du comportement, généralement de 1 ou de 0. Par exemple:
case comme ceci:
ou comme ceci:
Dans cet exemple, le test peut être utilisé pour indiquer si le répertoire a été trouvé. notez que quoi que ce soit après le retour ne sera pas exécutée dans la fonction. 0 est vrai, mais faux est de 1 dans la coquille, différent des autres prog langs.
Pour plus d'informations sur les fonctions:
http://www.linuxjournal.com/content/return-values-bash-functions
REMARQUE: Le isdirectory fonction est à titre indicatif seulement. Cela ne devrait pas être la façon dont vous effectuez une telle option dans un script réel.
test -d $1
pour obtenir le même résultat. Ne jamais faireif <check> return else return
.<check>
seront les seuls à faire la même chose dans toutes les langues que je connais au moins.isdirectory() { [ -d "$1" ]; }
va se comporter exactement le même que ce que vous avez ici: par défaut, La valeur de retour d'une fonction shell, que ce soit en atteignant la fin de son code ou par unreturn
sans arguments, c'est que de la commande la plus récente.return
déclaration. Il est vrai que son exemple est simpliste et ne pas être utilisée en production. Mais c'est simple, de sorte qu'il n'accomplit sa tâche à bien. Rien de mal avec elle.Rappelez-vous, les fonctions sont à l'intérieur d'un script et normalement retourner d'où ils avaient été appelés à l'aide de l'instruction return. L'appel d'un script externe est une tout autre affaire, et les scripts s'arrêtent généralement avec un rapport de sortie.
La différence "entre le retour et la sortie de déclaration en BASH fonctions en ce qui concerne les codes de sortie" est très peu. Les deux de retour à un état, de ne pas valeurs en soi. Un état de zéro indique la réussite, tandis que tout autre statut (de 1 à 255) indique une défaillance. L'instruction de retour sera de retour pour le script d'où il a été appelé, alors que la sortie de la déclaration de la fin de l'intégralité du script à partir de là où il est rencontré.
Si votre fonction se termine tout simplement avec aucune instruction de retour, l'état de la dernière commande exécutée est retourné en tant que code d'état (et sera placé dans
$?
).Rappelez-vous, le retour et la sortie de redonner un code d'état de 0 à 255, disponible en
$?
. Vous ne pouvez pas les trucs tout autre objet dans un code de statut (par exemple, le retour "chat"); il ne fonctionnera pas. Mais, un script peut passer à 255 différentes raisons de l'échec en utilisant des codes d'état.Vous pouvez définir des variables contenues dans le script d'appel, ou à l'écho des résultats dans la fonction et l'utilisation de la substitution de commande dans le script d'appel; mais le retour et la sortie sont à transmettre les codes d'état, et non pas les valeurs ou les résultats de calcul que l'on peut attendre dans un langage de programmation comme le C.
Parfois, vous exécutez un script à l'aide de
.
ousource
.Si vous incluez un
exit
dans lea.sh
, il ne sera pas seulement de terminer le script, mais à la fin de votre session shell.Si vous incluez un
return
dans lea.sh
, il s'arrête tout simplement le traitement du script.return: can only 'return' from a function or sourced script
, ce qui le rend impropre à un script général.all
situations. À l'aide de.
ousource
exécute le script dans le shell courant, plutôt que de fraie un sous-shell. Le script savoir comment il est utilisé. Malheur à l'utilisateur qui le fait en face. Personnellement, je recommande la lecture de scripts avant leur première exécution.trap
fonction pourERR EXIT
et puis d'abord enregistrer le code de sortie d'un échec de la commandeerrCode=$?
et puis la sortie du script (de source ou pas) avecreturn $errCode || exit $errCode
où la||
signifie "si je ne peux pas revenir parce que je n'ai pas de source, juste à la sortie de la place".Dans des mots simples (principalement pour les débutant dans le codage), nous pouvons dire,
Aussi Si vous l'avez remarqué, c'est très basique, mais...,
exit
n'est pas plus ou moins quereturn
. Ils sont intégrés dans les commandes. Ils ne sont même pas des mots réservés.exit
mettre fin à l'actuelle processus; avec ou sans code de sortie, c'est le système plus d'une fonction du programme. Notez que lors de l'approvisionnement,exit
ce sera la fin de la coquille, cependant, lors de l'exécution sera justeexit
le script.return
à partir d'une fonction revenir à l'instruction après l'appel,avec ou sans un code de retour.
return
est facultative et elle est impliciteà la fin de la fonction.
return
ne peut être utilisé à l'intérieur d'une fonction.Je tiens à ajouter que, tout en étant une source, il n'est pas facile de
exit
le script à partir de l'intérieur d'une fonction sans la tuer une coquille. Je pense, par exemple, est de mieux en mieux sur un 'test' scriptprocédant de la manière suivante:
test
-et - le shell va fermer.seulement
test
à terminer et à l'invite de l'émission.La solution est de placer le potentiellement procédure en
(
et)
maintenant, dans les deux cas seulement
test
quitter.(
et)
met ce bloc dans un sous-shell, effectivement des nations unies de faire la.
(source) de commande que si vous exécutez le script de test normalement, ce qui est dans un sous-shell. Si le script n'est pas exécuté avec.
ousource
alors vous avez effectivement 2 sous-shells.L'OP question:
Quelle est la différence entre le retour et la sortie de déclaration en BASH fonctions en ce qui concerne les codes de sortie?
Firtly, quelques précisions sont nécessaires:
Dans la balle au-dessus de la liste, choisir "(x|y)" soit toujours le premier élément ou toujours le deuxième élément pour obtenir des instructions sur les fonctions & retour ou de coquillages & sortie respectivement.
Ce qui est clair, c'est qu'ils ont tous deux en commun l'utilisation de la variable spéciale $? pour transmettre des valeurs à la hausse après leur fin.
* Maintenant, pour la manière spéciale que $? peuvent être définies:
Il est intéressant de noter que $? peut être affectée d'une valeur en appelant la sortie dans un sous-shell, comme ceci:
exit 259
echos comme3
parce que la dernière valeur de sortie est un seul octet.259 % 256 = 3
Tout d'abord,
return
est un mot-clé etexit
mon ami est une fonction.Cela dit, voici la plus simple des explications.
return
Elle renvoie une valeur à partir d'une fonction.
exit
Il sort d'ou abandonne le shell courant.
return
est un mot-clé. Le retour est beaucoup plus que juste des codes de sortie qui est pourquoi la comparaison n'est pas juste.exit
nireturn
sont des "mots-clés", ou, comme le manuel de bash les appelle, "mots réservés". Ni l'un est une "fonction", dans le sens d'une fonction bash. Les deux sont builtin commands, en bash lingo. (Il y a est une bibliothèque C standard fonction appeléeexit()
, et le langage de programmation C est un mot réservéreturn
, mais ceux qui ne devrait pas être confondu avec les commandes bash, même si leur sémantique est curieusement similaire.)