Lorsque j'utilise la exit
commande dans un script shell, le script met fin au terminal (l'invite). Existe-t-il un moyen de terminer un script et de rester ensuite dans le terminal?
run.sh
On s'attend à ce que mon script s'exécute en étant directement issu ou en provenance d'un autre script.
EDIT: Pour être plus précis, il existe deux scripts run2.sh
comme
...
. run.sh
echo "place A"
...
et run.sh
comme
...
exit
...
quand je le lance . run2.sh
, et s'il atteint la ligne de exit
code run.sh
, je veux qu'il s'arrête au terminal et y reste. Mais en utilisant exit
, tout le terminal se ferme.
PS: j'ai essayé d'utiliser return
, mais la echo
codeline sera toujours exécutée ...
exit 0
pour terminer le script après le succès, lorsque vous exécutez votre script ex:./test.sh
vous devriez voir la sortie mais votre console restera ouverte.shell
commande, qui ouvre en fait un terminal shell. Ma propre expérience est cependant que cela ne se produit pas avecexit
. Exit redonne normalement le contrôle au script parent.Réponses:
Le "problème" est vraiment que vous sourcez et que vous 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. Donc, tout, y compris la sortie, affectera le shell actuel.
Au lieu d'utiliser
exit
, vous voudrez utiliserreturn
.la source
runs.sh
@ruakh a la meilleure réponse à cette question.sh <script>
oubash <script>
si l'on veut exécuter un script et terminer à un moment donnéOui; vous pouvez utiliser à la
return
place deexit
. Son objectif principal est de retourner à partir d'une fonction shell, mais si vous l'utilisez dans unsource
script -d, il renvoie à partir de ce script.Comme le décrit le §4.1 «Bourne Shell Builtins» du Manuel de référence de Bash :
la source
return
peut UNIQUEMENT être utilisé à partir d'une fonction. Si vous l'utilisezreturn
et l'exécutez en tant que script shell (par exemplesh run.sh
), bash signalera une erreur -return: can only
retourne «à partir d'une fonction ou d'un script source»return
cela ne fonctionnera pas si le script est exécuté en tant que script shell et non exécuté par. (ousource
). BTW, où puis-je trouver le document sursource -d
?Au lieu d'exécuter le script en utilisant
. run2.sh
, vous pouvez l'exécuter en utilisantsh run2.sh
oubash run2.sh
Un nouveau sous-shell sera lancé, pour exécuter le script ensuite, il se fermera à la fin du script laissant l'autre shell ouvert.
la source
sh "." run2.sh
?Vous pouvez ajouter une commande de sortie supplémentaire après l'instruction / la commande de retour afin qu'elle fonctionne pour les deux, en exécutant le script à partir de la ligne de commande et en sourcing depuis le terminal.
Exemple de code de sortie dans le script:
La ligne avec la
exit
commande ne sera pas appelée lorsque vous sourcez le script après lareturn
commande.Lorsque vous exécutez le script, la
return
commande génère une erreur. Ainsi, nous supprimons le message d'erreur en le transférant vers/dev/null
.la source
En fait, je pense que vous pourriez être confus par la façon dont vous devriez
run a script
.Si vous utilisez
sh
pour exécuter un script, par exemple,sh ./run2.sh
même si le script intégré se termine parexit
, votre fenêtre de terminal restera toujours.Cependant, si vous utilisez
.
ousource
, la fenêtre de votre terminal se fermera / se fermera également à la fin de l'indice.Pour plus de détails, veuillez consulter Quelle est la différence entre l'utilisation
sh
etsource
?la source
C'est comme si vous mettiez une fonction d'exécution dans votre script run2.sh. Vous utilisez le code de sortie à l'intérieur de run tout en source votre fichier run2.sh dans le bash tty. Si vous donnez à la fonction run le pouvoir de quitter votre script et donnez au run2.sh le pouvoir de quitter le terminateur. Puis de cuz la fonction run a le pouvoir de quitter votre teminator.
Quoi qu'il en soit, j'approuve avec Kaz c'est un problème de conception.
la source
J'ai eu le même problème et d'après les réponses ci-dessus et d'après ce que j'ai compris, ce qui a fonctionné pour moi était finalement:
Avoir une ligne shebang qui appelle le script prévu, par exemple,
#!/bin/bash
utilisebash
pour exécuter le scriptJ'ai des scripts avec les deux types de shebang. Pour cette raison, utiliser
sh
ou.
n'était pas fiable, car cela conduisait à une mauvaise exécution (comme lorsque le script renonce à s'exécuter de manière incomplète)La réponse était donc
(chmod +x file.sh)
Invoquer directement sans
sh
ou.
(./myscript.sh)
J'espère que cela aide quelqu'un avec une question ou un problème similaire.
la source
Je pense que cela se produit parce que vous l'exécutez en mode source avec le point
Vous devriez l'exécuter dans un sous-shell:
«source» http://ss64.com/bash/source.html
la source
. myscript.sh
fonctionne. Tout au plus, vous pourriez avoir besoin./myscript.sh
.Il est correct que les scripts source et exécutés utilisent
return
plutôt queexit
pour garder la même session ouverte, comme d'autres l'ont noté.Voici une astuce connexe, si vous voulez un script qui devrait garder la session ouverte, qu'elle soit ou non d'origine.
L'exemple suivant peut être exécuté directement comme
foo.sh
ou généré comme. foo.sh
/source foo.sh
. Dans tous les cas, la session restera ouverte après la "sortie". La$@
chaîne est transmise afin que la fonction ait accès aux arguments du script externe.Résultat final:
Cela peut être utile pour tester rapidement les modifications de script dans un seul terminal tout en gardant un tas de code de ferraille sous le main
exit
/return
pendant que vous travaillez. Cela pourrait également rendre le code plus portable dans un sens (si vous avez des tonnes de scripts qui peuvent ou non être appelés de différentes manières), bien qu'il soit beaucoup moins maladroit à utiliserreturn
et leexit
cas échéant.la source
si votre émulateur de terminal ne l'a pas,
-hold
vous pouvez nettoyer un script source et maintenir le terminal avec:sinon vous pouvez utiliser
$TERM -hold -e script
la source
Assurez-vous également de retourner avec la valeur de retour attendue. Sinon, si vous utilisez exit lorsque vous rencontrez une sortie, il quittera votre shell de base car la source ne crée pas un autre processus (instance).
la source
Pour écrire un script qui est sûr d'être exécuté en tant que script shell ou d' origine en tant que fichier rc, le script peut vérifier et comparer
$0
et$BASH_SOURCE
et déterminer siexit
peut être utilisé en toute sécurité.Voici un court extrait de code pour cela
la source
1) exit 0 sortira du script s'il réussit.
2) exit 1 sortira du script s'il s'agit d'un échec.
Vous pouvez essayer ces deux ci-dessus en fonction de votre demande.
la source