J'utilise un script qui utilise la fonctionnalité source bash.
#!/bin/bash
source someneatscriptthatendsprematurely.sh
J'aimerais pouvoir revenir de ce script sans casser le script principal.
L'utilisation de exit rompt le script principal, return n'est valide que dans les fonctions et l'expérimentation avec $ (exit 1) ne semble pas non plus fonctionner.
Alors, est-il possible de revenir dans un script de sous-bash sans casser le bash principal?
Toute aide appréciée!
Vous avez besoin de l'instruction return
:
return [n]
Force une fonction à quitter avec la valeur de retour spécifiée par
n
. Sin
est omis, l'état de retour est celui de la dernière commande exécutée dans le corps de la fonction. S'il est utilisé en dehors d'une fonction, mais lors de l'exécution d'un script par la commande.
(source), le shell cesse d'exécuter ce script et renvoie soitn
, soit le statut de sortie de la dernière commande exécutée dans le script, en tant que statut de sortie de le scénario. S'il est utilisé en dehors d'une fonction et non pendant l'exécution d'un script par.
, le statut de retour est false. Toute commande associée à l’interruption RETURN est exécutée avant que l’exécution ne reprenne après la fonction ou le script.
Vous pouvez le voir en action avec les deux scripts suivants:
script1.sh:
. script2.sh
echo hello again
script2.sh:
echo hello
return
echo goodbye
Lorsque vous exécutez script1.sh
, vous voyez:
hello
hello again
Est-il important que vous puissiez modifier les variables d'environnement? Sinon, vous pouvez simplement exécuter le script en l'exécutant sans source:
someneatscriptthatendsprematurely.sh
J'ai eu le même problème tout à l'heure
J'ai réalisé que l'ajout d'une fonction de vérificateur et le renvoi de celui-ci ne renverraient pas la fonction sur l'appelant, par exemple.
Sur bash_functions
function install_packer_linux() {
check_wget && check_unzip
wget https://releases.hashicorp.com/packer/1.1.2/packer_1.1.2_linux_AMD64.Zip
unzip packer_1.1.2_linux_AMD64.Zip
mv packer ~/.local/bin
rm -f packer_1.1.2_linux_AMD64.Zip
}
function check_unzip() {
if ! [ -x "$(command -v unzip)" ]; then
echo "Error: unzip is not installed"
return 1
else
return 0
fi
}
function check_wget() {
if ! [ -x "$(command -v wget)" ]; then
echo "Error!: wget is not installed"
return 1
else
return 0
fi
}
$ source ~/.bash_functions
Qu'est-ce qui se passe ici est depuis que les vérificateurs est le seul endroit où il est retourné afin install_packer_linux continuera toujours
Donc, vous pouvez faire deux choses ici. Soit conserver le format actuel (fonction appelant une autre fonction) en l'état et évaluer à l'aide de la valeur vérité, puis renvoyer si les valeurs ne sont pas véridique, ou réécrire le vérificateur sur la fonction principale installer_packer_linux.
Vérité
function install_packer_linux() {
check_wget && check_unzip || return
wget https://releases.hashicorp.com/packer/1.1.2/packer_1.1.2_linux_AMD64.Zip
unzip packer_1.1.2_linux_AMD64.Zip
mv packer ~/.local/bin
rm -f packer_1.1.2_linux_AMD64.Zip
}
Avis que nous avons ajouté || retourner après les vérifications et concaténer les vérifications en utilisant && donc si non les deux vérifications sont vraies nous retournons la fonction