GNU/Linux >> Tutoriels Linux >  >> Linux

Bash + Comment quitter le script secondaire et le script principal à chaque fois ?

Nous exécutons le script script1 depuis le script script_main

script_main :

#!/bin/bash
/tmp/script1
echo $?

sleep 2
echo script ended 

script1 :

#!/bin/bash
exit 1

Comme il est évident, script1 sort avec le code de sortie 1
mais le script principal continuera jusqu'à la fin.

Ma question :est-ce possible lorsque script1 est-ce que exit 1 , puis aussi le main_script sera arrêté immédiatement ?

Réponse acceptée :

Le moyen le plus simple serait d'avoir explicitement le premier script exit si l'autre script a échoué. Mettez l'exécution du script dans une condition, comme

otherscript.sh || exit 1

ou

if ! otherscript.sh ; then
      ret=$?
      echo "otherscript failed with exit code $ret. exit." >&2
      exit 1
fi

Cela permettrait au script principal d'effectuer le nettoyage qu'il souhaite, ou simplement d'essayer une autre solution, éventuellement en fonction du code de sortie de l'enfant. Dans le premier, nous pourrions utiliser uniquement || exit , pour transmettre le code de sortie de l'enfant.

Si vous voulez que le script principal se ferme quand tout la commande qu'il démarre échoue, alors set -e .

set -e
otherscript.sh
echo "this will not run if otherscript fails"

set -e ne s'applique pas aux programmes qui s'exécutent à l'intérieur de constructions conditionnelles, nous pouvons donc toujours tester des codes particuliers ou les suivre avec || true pour ignorer l'échec. Mais avec des points de sortie partout maintenant, nous pourrions utiliser trap somecmd EXIT pour effectuer un nettoyage avant la fermeture du shell, quel que soit l'endroit où il se produit.

Il est également possible que le script interne force le script principal à se fermer, mais un peu hostile, vous ne vous attendriez pas à ce qu'une application habituelle le fasse. Mais, si vous le souhaitez, le simple fait que le script interne tire sur son processus parent est un moyen :

$ cat mainscript.sh
#!/bin/bash
./otherscript.sh
echo "$0 exiting normally"
$ cat otherscript.sh
#!/bin/bash
echo "$0 kill $PPID"
kill $PPID

$ bash mainscript.sh
./otherscript.sh kill 11825
Terminated

Ici, si vous exécutez otherscript.sh depuis un shell interactif, il tentera de filmer la session interactive. Tous les shells que j'ai testés semblent ignorer le SIGTERM dans ce cas lors de l'exécution interactive, cependant. Dans tous les cas, le shell principal pourrait à nouveau trap le SIGTERM .

Au lieu de tirer uniquement sur le processus parent, vous pouvez utiliser kill 0 pour tuer tous les processus du groupe de processus otherscript.sh s'exécute. S'il est démarré à partir d'un shell non interactif, cela inclura généralement le parent.

En relation :Comment chronométrer plusieurs processus d'arrière-plan ?
Linux
  1. Comment déboguer un script bash ?

  2. Script Bash pour supprimer le fichier le plus ancien d'un dossier ?

  3. Comment savoir si je suis dans une session Tmux à partir d'un script bash ?

  4. Comment obtenir le statut de sortie d'une boucle dans bash

  5. Comment écrire un script bash ou automatiser l'ouverture de vi et modifier le document ?

Comment obtenir la date et l'heure actuelles en Python

Bash break :comment sortir d'une boucle

Comment exécuter un script bash

LA FAÇON FACILE comment SSH dans Bash et WSL2 sur Windows 10 à partir d'une machine externe

Script bash pour supprimer le fichier le plus ancien d'un dossier

En quoi le temps CPU et l'utilisation du CPU sont-ils identiques ?