web-dev-qa-db-fra.com

Comment retournez-vous à un script bash source?

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!

41
codar

Vous avez besoin de l'instruction return:

return [n]

Force une fonction à quitter avec la valeur de retour spécifiée par n. Si n 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 soit n, 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
61
paxdiablo

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
1
Bart Sas

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

0
Kenichi Shibata