251 votes

De toute façon pour quitter le script bash, mais de ne pas abandonner le terminal

Lorsque j'utilise exit commande dans un shell script, le script sera terminé, le terminal (le prompt). Est-il possible de résilier un script, puis rester dans le terminal?

Mon script run.sh est attendue pour l'exécuter directement par source, ou proviennent d'un autre script.

EDIT: Pour être plus précis, il y a deux scripts run2.sh comme

...
. run.sh
echo "place A"
...

et run.sh comme

...
exit
...

quand je le lance en . run2.sh, et si il a frappé exit d. en run.sh, je veux que ça arrête au terminal et d'y rester. Mais à l'aide de exit, le terminal se ferme.

PS: j'ai essayé d'utiliser return, mais echo d. sera toujours exécuté....

356voto

Dominik Honnef Points 8050

Le "problème" c'est que vous êtes de sourcing et de la non-exécution de script. Lorsque vous source d'un fichier, son contenu sera exécutée dans le shell courant, au lieu de pondre un shell interne est exécuté. Donc, tout, y compris la sortie, aura une incidence sur le shell courant.

Au lieu d'utiliser exit,, vous souhaitez utiliser return.

51voto

ruakh Points 68789

Oui, vous pouvez utiliser return au lieu de exit. Son but principal est de retour d'une fonction shell, mais si vous l'utilisez dans un source-d de script, il revient à partir de ce script.

Comme le§4.1 de la "Bourne Shell objets internes" de l' Bash Manuel de Référence met:

     return [n]

Causer une fonction shell à la sortie avec la valeur de retour n. Si n n'est pas fourni, la valeur de retour est le statut de sortie de la 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 l' . (ou source) builtin, de retour soit nou le statut de sortie de la dernière commande exécutée dans le script de la sortie statut du script. Toute commande correspondant à l' RETURN interruption est exécutée avant l'exécution reprend après la fonction ou un script. Le retour d'état est non-nul si return est utilisé en dehors d'une fonction et non pas lors de l'exécution d'un script en . ou source.

3voto

Umae Points 91

C'est juste comme vous mettez une fonction d'exécution à l'intérieur de votre script run2.sh. Vous utilisez le code de sortie à l'intérieur de l'exécuter pendant que la source de votre run2.sh fichier dans le bash ats. Si la donner à la fonction d'exécution de sa puissance à la sortie de votre script et de le donner à la run2.sh sa puissance de sortie du module de terminaison. Puis de cuz l'exécution de la fonction de la puissance de sortie de votre teminator.

    #! /bin/sh
    # use . run2.sh

    run()
    {
        echo "this is run"
        #return 0
        exit 0
    }

    echo "this is begin"
    run
    echo "this is end"

De toute façon, j'approuve avec Kaz c'est un problème de conception.

2voto

JBoy Points 897

Je pense que cela se passe parce que vous l'exécutez en mode source avec le point

. myscript.sh

Vous devez exécuter que dans un shell interne est exécuté:

/full/path/to/script/myscript.sh

"la source" http://ss64.com/bash/source.html

0voto

technosaurus Points 1980

si votre émulateur de terminal ne dispose pas d' -hold vous pouvez désinfecter une source de script et maintenez le terminal:

#!/bin/sh
sed "s/exit/return/g" script >/tmp/script
. /tmp/script
read

sinon, vous pouvez utiliser $TERM -hold -e script

Prograide.com

Prograide est une communauté de développeurs qui cherche à élargir la connaissance de la programmation au-delà de l'anglais.
Pour cela nous avons les plus grands doutes résolus en français et vous pouvez aussi poser vos propres questions ou résoudre celles des autres.

Powered by:

X