Soit ce que je demande ici est extrêmement peu orthodoxe / non conventionnel / risqué, soit mes compétences Google-fu ne sont tout simplement pas à la hauteur ...
Dans un bash
script shell, y a-t-il un moyen simple de dire s'il provient d'un autre script shell ou s'il est exécuté par lui-même? En d'autres termes, est-il possible de différencier les deux comportements suivants?
# from another shell script
source myScript.sh
# from command prompt, or another shell script
./myScript.sh
Ce que je pense faire, c'est de créer un script shell de type utilitaire contenant des bash
fonctions qui peuvent être rendues disponibles une fois sourcées. Lorsque ce script est exécuté par lui-même, j'aime qu'il effectue également certaines opérations, en fonction des fonctions définies. Existe-t-il une sorte de variable d'environnement sur laquelle ce script shell peut s'appuyer, par exemple
some_function() {
# ...
}
if [ -z "$IS_SOURCED" ]; then
some_function;
fi
De préférence, je recherche une solution qui ne nécessite pas le script d'appelant pour définir des variables d'indicateur.
edit : Je connais la différence entre l'approvisionnement et l'exécution du script, ce que j'essaie de découvrir ici s'il est possible de faire la différence dans le script utilisé (dans les deux sens).
.
commande, mais sur la détection si un script a été généré ou exécuté normalement (c'est-à-dire dans un sous-shell).Réponses:
Oui - la variable $ 0 donne le nom du script tel qu'il a été exécuté:
Qui fonctionne comme:
Cela ne répond pas à la source d'un shell interactif, mais vous avez cette idée (j'espère).
Mis à jour pour inclure BASH_SOURCE - merci hjk
la source
La combinaison de la réponse de @ DarkHeart avec la variable d'environnement
BASH_SOURCE
semble faire l'affaire:edit Semble encore être une solution plus simple si je devais simplement compter le nombre d'éléments dans
BASH_SOURCE
le tableau de:la source
Je viens de créer le même type de script de bibliothèque qui fonctionne beaucoup comme BusyBox. Dans ce document, j'utilise la fonction suivante pour tester si elle provient ...
Le tableau FUNCNAME géré par Bash est essentiellement une pile d'appels de fonction.
$FUNCNAME
(ou${FUNCNAME[0]}
) est le nom de la fonction en cours d'exécution.${FUNCNAME[1]}
est le nom de la fonction qui l'a appelée, etc.L'élément le plus haut est une valeur spéciale pour le script lui-même. Il contiendra ...
La fonction ci-dessus ne fonctionne réellement que lorsqu'elle est appelée au niveau du script (ce qui est tout ce dont j'avais besoin). Il échouerait s'il était appelé depuis une autre fonction car le numéro d'élément du tableau serait incorrect. Pour le faire fonctionner n'importe où, il faut trouver le haut de la pile et tester cette valeur, ce qui est plus compliqué.
Si vous en avez besoin, vous pouvez obtenir le numéro d'élément de tableau du "haut de la pile" avec ...
${#FUNCNAME[@]}
est le nombre d'éléments dans le tableau. En tant que tableau à base zéro, nous soustrayons 1 pour obtenir le dernier élément #.Ces trois fonctions sont utilisées ensemble pour produire une trace de pile de fonctions similaire à celle de Python et elles peuvent vous donner une meilleure idée de la façon dont tout cela fonctionne ...
Notez que FUNCNAME, BASH_SOURCE et BASH_LINENO sont 3 tableaux maintenus par bash comme s'il s'agissait d'un tableau en trois dimensions.
la source
Je veux juste ajouter que le comptage du tableau semble peu fiable et il ne faut probablement pas supposer qu'il a
source
été utilisé car l'utilisation d'un point (.
) est également très courante (et antérieure ausource
mot - clé).Par exemple, pour un
sourced.sh
script contenant uniquementecho $0
:Les solutions de comparaison suggérées fonctionnent mieux.
la source
Une façon qui fonctionne également lors de l'approvisionnement à partir d'un shell interactif :
La
BASH_LINENO
variable est également un tableau avec toutes les lignes où la fonction appelante a été exécutée. Il sera nul si vous appelez directement le script, ou un entier correspondant à un numéro de ligne.La documentation BASH_ * variable
la source