O lo que estoy preguntando aquí es extremadamente poco ortodoxo / poco convencional / arriesgado, o mis habilidades de Google-fu simplemente no están a la altura ...
En un bash
script de shell, ¿hay alguna manera fácil de saber si otro script de shell lo obtiene o se ejecuta solo? En otras palabras, ¿es posible diferenciar entre los siguientes dos comportamientos?
# from another shell script
source myScript.sh
# from command prompt, or another shell script
./myScript.sh
Lo que pienso hacer es crear un script de shell similar a las utilidades que contenga bash
funciones que puedan estar disponibles cuando se obtengan. Sin embargo, cuando este script se ejecute solo, me gustaría que realice ciertas operaciones, también en función de las funciones definidas. ¿Hay algún tipo de variable de entorno que este script de shell pueda detectar, p. Ej.
some_function() {
# ...
}
if [ -z "$IS_SOURCED" ]; then
some_function;
fi
Preferiblemente, estoy buscando una solución que no requiera que el script de llamada establezca ninguna variable de marca.
editar : Sé la diferencia entre el abastecimiento y la ejecución del script, lo que estoy tratando de descubrir aquí si es posible distinguir la diferencia en el script que se está utilizando (en ambos sentidos).
fuente
.
comando en absoluto, sino sobre la detección de si un script se ha originado o ejecutado normalmente (es decir, en una subshell).Respuestas:
Sí, la variable $ 0 da el nombre del script tal como se ejecutó:
Que funciona como:
Eso no sirve para ser fuente de un shell interactivo, pero se entiende esta idea (espero).
Actualizado para incluir BASH_SOURCE - gracias hjk
fuente
La combinación de la respuesta de @ DarkHeart con la variable de entorno
BASH_SOURCE
parece hacer el truco:edit Parece ser una solución más simple aún si tuviera que contar la cantidad de elementos en
BASH_SOURCE
la matriz:fuente
Acabo de crear el mismo tipo de script de biblioteca que funciona mucho como BusyBox. En él, utilizo la siguiente función para probar si se está obteniendo ...
La matriz FUNCNAME mantenida por Bash es esencialmente una pila de llamadas de función.
$FUNCNAME
(o${FUNCNAME[0]}
) es el nombre de la función que se está ejecutando actualmente.${FUNCNAME[1]}
es el nombre de la función que lo llamó, y así sucesivamente.El elemento superior es un valor especial para el script en sí. Contendrá ...
La función anterior en realidad solo funciona cuando se llama a nivel de script (que es todo lo que necesitaba). Fallaría si se llama desde otra función porque el número de elemento de la matriz sería incorrecto. Para que funcione en cualquier lugar requiere encontrar la parte superior de la pila y probar ese valor, lo cual es más complicado.
Si lo necesita, puede obtener el número de elemento de la matriz de la "parte superior de la pila" con ...
${#FUNCNAME[@]}
es el número de elementos en la matriz. Como una matriz basada en cero, restamos 1 para obtener el último elemento #.Estas tres funciones se usan juntas para producir un seguimiento de la pila de funciones similar al de Python y pueden darle una mejor idea de cómo funciona todo esto ...
Tenga en cuenta que FUNCNAME, BASH_SOURCE y BASH_LINENO son 3 matrices mantenidas por bash como si fueran una matriz tridimensional.
fuente
Solo quiero agregar que contar el conjunto parece no ser confiable y uno probablemente no debería suponer que
source
se usó ya que usar un punto (.
) también es muy común (y es anterior a lasource
palabra clave).Por ejemplo, para un
sourced.sh
script que contiene soloecho $0
:Las soluciones de comparación sugeridas funcionan mejor.
fuente
Una forma que también funciona cuando se obtiene de un shell interactivo :
La
BASH_LINENO
variable también es una matriz con todas las líneas en las que se ejecutó la función de llamada. Será cero si llama al script directamente, o un número entero correspondiente a un número de línea.Los documentos variables BASH_ *
fuente