107 votes

Est-il possible d'écrire une fonction bash qui abandonne l'ensemble de l'exécution, peu importe comment il s'appelle?

J'ai été à l'aide de "sortie 1" énoncé dans mon bash fonctions de résilier le script en entier et il a bien fonctionné:

function func()
{
   echo "Goodbye"
   exit 1
}
echo "Function call will abort"
func
echo "This will never be printed"

Mais ensuite j'ai réalisé qu'il ne fait pas le travail, lorsqu'il est appelé comme:

res=$(func)

Je comprends que j'ai créé un shell interne est exécuté et "sortie 1" abandonne que shell interne est exécuté et pas la principale....

Mais est-il possible d'écrire une fonction qui abandonne l'ensemble de l'exécution, peu importe comment il s'appelle? J'ai juste besoin pour obtenir la vraie valeur de retour (repris par la fonction).

121voto

FatalError Points 19772

Ce que vous pourriez faire, c'est enregistrer le haut niveau de shell pour l' TERM du signal de sortie, puis envoyer un TERM pour le haut niveau de shell:

#!/bin/bash
trap "exit 1" TERM
export TOP_PID=$$

function func()
{
   echo "Goodbye"
   kill -s TERM $TOP_PID
}

echo "Function call will abort"
echo $(func)
echo "This will never be printed"

Donc, votre fonction envoie un TERM le signal de retour à haut niveau de shell, qui est capturé et gérées à l'aide de la commande fourni, dans ce cas, "exit 1".

56voto

brice Points 5740

Vous pouvez utiliser set -e:

set -e 
func
set +e

Ou saisir la valeur de retour:

(func) || exit $?

2voto

Daenyth Points 11297

Un processus enfant ne peut pas forcer le processus parent pour fermer implicitement. Vous avez besoin d'utiliser une sorte de mécanisme de signalisation. Les Options peuvent inclure une déclaration spéciale de la valeur, ou peut-être envoyer un signal avec kill, quelque chose comme

function child() {
    local parent_pid="$1"
    local other="$2"
    ...
    if [[ $failed ]]; then
        kill -QUIT "$parent_pid"
    fi
}

0voto

Luca Points 2222

Mais est-il possible d'écrire une fonction qui abandonne l'ensemble de l'exécution, peu importe comment il s'appelle?

Pas de.

J'ai juste besoin pour obtenir la vraie valeur de retour (repris par la fonction).

Vous pouvez

res=$(func)
echo $?

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