Oui; vous pouvez utiliser return
au lieu de exit
. Son objectif principal est de revenir d'une fonction shell, mais si vous l'utilisez dans un source
-d script, il revient à partir de ce script.
Comme §4.1 "Bourne Shell Builtins" du Bash Reference Manual le met :
return [n]
Provoque la sortie d'une fonction shell avec la valeur de retour n .Si n n'est pas fourni, la valeur de retour est l'état de sortie de la dernière commande exécutée dans la fonction. Cela peut également être utilisé pour terminer l'exécution d'un script en cours d'exécution avec le
.
(ousource
) intégré, renvoyant soit n oul'état de sortie de la dernière commande exécutée dans le script comme état de sortie du script.Toute commande associée auRETURN
le trap est exécuté avant que l'exécution ne reprenne après la fonction ou le script. L'état de retour est différent de zéro sireturn
est utilisé en dehors d'une fonction et non lors de l'exécution d'un script par.
ousource
.
Au lieu d'exécuter le script en utilisant . run2.sh
, vous pouvez l'exécuter en utilisant sh run2.sh
ou bash run2.sh
Un nouveau sous-shell sera démarré, pour exécuter le script ensuite, il sera fermé à la fin du script laissant l'autre shell ouvert.
Le "problème" est vraiment que vous recherchez et n'exécutez pas le script. Lorsque vous sourcez un fichier, son contenu sera exécuté dans le shell actuel, au lieu de générer un sous-shell. Ainsi, tout, y compris la sortie, affectera le shell actuel.
Au lieu d'utiliser exit
, vous voudrez utiliser return
.
Vous pouvez ajouter une commande de sortie supplémentaire après l'instruction/commande de retour afin qu'elle fonctionne pour les deux, en exécutant le script à partir de la ligne de commande et en s'approvisionnant depuis le terminal.
Exemple de code de sortie dans le script :
if [ $# -lt 2 ]; then
echo "Needs at least two arguments"
return 1 2>/dev/null
exit 1
fi
La ligne avec le exit
la commande ne sera pas appelée lorsque vous sourcez le script après le return
commande.
Lorsque vous exécutez le script, return
commande donne une erreur. Donc, nous supprimons le message d'erreur en le transmettant à /dev/null
.