Différence entre le retour et la sortie des fonctions Bash

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" 

    Sortie

     $ ./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:

    • Une instruction (return | exit) n’est pas requirejse pour terminer l’exécution d’un (function | shell). Un (function | shell) se terminera lorsqu’il atteindra la fin de sa liste de codes, même sans instruction (return | exit).
    • Une instruction (return | exit) n’est pas requirejse pour renvoyer une valeur à partir d’un terminal (fonction | shell). Chaque processus a une variable intégrée $? qui a toujours une valeur numérique. C’est une variable spéciale qui ne peut pas être définie comme “? = 1”, mais qui n’est définie que de manière spéciale (voir ci-dessous *). La valeur de $? après la dernière commande à exécuter dans la (appelée fonction | sous-shell) est la valeur qui est transmise à la fonction appelante | parent shell. Cela est vrai que la dernière commande exécutée soit (“return [n]” | “exit [n]”) ou plain (“return” ou autre chose qui se trouve être la dernière commande du code des fonctions appelées.

    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:

    • Quand une fonction appelée se termine et retourne à son appelant alors $? dans l’appelant sera égal à la valeur finale de $? dans la fonction terminée.
    • Quand un shell parent attend implicitement ou explicitement un seul sous-shell et est libéré par la fin de ce sous-shell, alors $? dans le shell parent sera égal à la valeur finale de $? dans le sous-shell terminé.
    • Certaines fonctions intégrées peuvent modifier $? en fonction de leur résultat. Mais certains ne le font pas.
    • Les fonctions intégrées “return” et “exit”, suivies d’un argument numérique $? avec argument, et terminer l’exécution.

    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