Albo to, o co tutaj pytam, jest wyjątkowo niekonwencjonalne / niekonwencjonalne / ryzykowne, albo moje umiejętności posługiwania się Google-fu po prostu nie wystarczą ...
Czy w bash
skrypcie powłoki można w łatwy sposób stwierdzić, czy jest pozyskiwany przez inny skrypt powłoki, czy jest uruchamiany sam? Innymi słowy, czy można rozróżnić następujące dwa zachowania?
# from another shell script
source myScript.sh
# from command prompt, or another shell script
./myScript.sh
Mam na myśli stworzenie skryptu powłoki podobnego do narzędzi, zawierającego bash
funkcje, które można udostępnić podczas pozyskiwania. Kiedy ten skrypt jest uruchamiany sam, chciałbym, aby wykonywał pewne operacje, w oparciu również o zdefiniowane funkcje. Czy istnieje jakaś zmienna środowiskowa, którą ten skrypt powłoki może pobrać, np
some_function() {
# ...
}
if [ -z "$IS_SOURCED" ]; then
some_function;
fi
Najlepiej szukam rozwiązania, które nie wymaga skryptu wywołującego do ustawiania żadnych zmiennych flag.
edycja : Znam różnicę między pozyskiwaniem a uruchamianiem skryptu, co staram się tutaj sprawdzić, czy można odróżnić używany skrypt (na dwa sposoby).
źródło
.
polecenie, ale o wykrycie, czy skrypt został pobrany lub działa normalnie (tj. W podpowłoce).Odpowiedzi:
Tak - zmienna $ 0 podaje nazwę skryptu podczas jego uruchamiania:
Który działa jak:
To nie zaspokaja bycia źródłem z interaktywnej powłoki, ale masz ten pomysł (mam nadzieję).
Zaktualizowano, aby zawierał BASH_SOURCE - dzięki hjk
źródło
Wydaje się, że połączenie odpowiedzi @ DarkHeart ze zmienną środowiskową
BASH_SOURCE
:edit Wydaje się być jeszcze prostszym rozwiązaniem, gdybym po prostu policzył liczbę elementów w
BASH_SOURCE
tablicy:źródło
Właśnie stworzyłem ten sam skrypt biblioteki, który działa podobnie jak BusyBox. W nim używam następującej funkcji, aby sprawdzić, czy jest pozyskiwana ...
Obsługiwana przez Bash tablica FUNCNAME jest zasadniczo stosem wywołań funkcji.
$FUNCNAME
(lub${FUNCNAME[0]}
) to nazwa aktualnie wykonywanej funkcji.${FUNCNAME[1]}
to nazwa funkcji, która ją wywołała i tak dalej.Najwyższy element jest specjalną wartością dla samego skryptu. Będzie zawierać ...
Powyższa funkcja faktycznie działa tylko wtedy, gdy jest wywoływana na poziomie skryptu (co jest wszystkim, czego potrzebuję). Nie powiedzie się, jeśli zostanie wywołany z innej funkcji, ponieważ numer elementu tablicy będzie nieprawidłowy. Aby działało w dowolnym miejscu, trzeba znaleźć górę stosu i przetestować tę wartość, co jest bardziej skomplikowane.
Jeśli potrzebujesz, możesz uzyskać numer pozycji tablicy „góra stosu” za pomocą ...
${#FUNCNAME[@]}
to liczba elementów w tablicy. Jako tablicę zerową odejmujemy 1, aby uzyskać ostatni element #.Te trzy funkcje są używane razem, aby utworzyć ślad stosu funkcji podobny do Pythona i mogą dać ci lepszy pomysł, jak to wszystko działa ...
Zauważ, że FUNCNAME, BASH_SOURCE i BASH_LINENO to 3 tablice obsługiwane przez bash, tak jakby były jedną trójwymiarową tablicą.
źródło
Wystarczy dodać, że zliczanie tablicy wydaje się niewiarygodne i prawdopodobnie nie należy zakładać, że
source
została użyta, ponieważ użycie kropki (.
) jest również bardzo powszechne (i poprzedzasource
słowo kluczowe).Na przykład dla
sourced.sh
skryptu zawierającego tylkoecho $0
:Sugerowane rozwiązania porównawcze działają lepiej.
źródło
Jednym ze sposobów, który działa również podczas pozyskiwania z interaktywnej powłoki :
BASH_LINENO
Zmienna jest tablicą ze wszystkimi liniami funkcja wywoływania został zrealizowany na. Wyzeruje się, jeśli wywołasz skrypt bezpośrednio lub liczbę całkowitą odpowiadającą numerowi linii.Dokumenty zmiennej BASH_ *
źródło