Powiedz mi, jak wyeksportować funkcję w powłoce nadrzędnej (bash, sh lub ksh), aby była dostępna dla wszystkich procesów potomnych uruchamianych z procesu nadrzędnego?
Powiedz mi, jak wyeksportować funkcję w powłoce nadrzędnej (bash, sh lub ksh), aby była dostępna dla wszystkich procesów potomnych uruchamianych z procesu nadrzędnego?
Odpowiedzi:
Ta export -ffunkcja jest specyficzna dla Bash:
rodzic
#!/bin/bash
plus1 () { echo $(($1 + 1)); }
echo $(plus1 8)
export -f plus1
./child 14 21
dziecko
#!/bin/bash
echo $(plus1 $(($1 * $2)) )
W sh, to nie można eksportować funkcję, jak zauważył Charles Duffy .
Jeśli używasz ksh lub zsh:
Możesz użyć zmiennej środowiskowej FPATH, w której możesz umieścić wszystkie swoje funkcje.
Jeśli FPATHjest ustawiona na interpreter interaktywny, a polecenie lub funkcja nie zostaną znalezione w bieżącym środowisku powłoki lub w PATH, wymienione tam katalogi są przeszukiwane pod kątem istnienia pliku nazwanego na podstawie brakującego polecenia. Jeśli zostanie znaleziony, jest pobierany w bieżącym środowisku powłoki i oczekuje się, że zdefiniuje funkcję.
Możesz więc umieścić wszystkie swoje funkcje w lokalizacji w FPATH, a skrypty podrzędne również będą mogły je znaleźć.
Możesz użyć autoloadpolecenia w skryptach powłoki, aby załadować wymagane funkcje:
autoload fun_a fun_b
W zsh autoloadjest wymagane FPATHdo działania. kshWierzę, że w programie In i jego bliskich krewnych po prostu powoduje, że funkcje zdefiniowane w programie FPATHzastępują zwykłe polecenia w twojej PATH, tak jakby były zdefiniowane bezpośrednio.
Kilka szczegółów na temat FPATHi autoload:
Jeśli utworzysz podpowłoki za pomocą ( ), odziedziczą one migawkę wszystkich definicji, parametrów i zmiennych powłoki.
Jeśli wykonujesz je jak programy, możesz umieścić definicje w .bashrc.
Jeśli próbujesz sfałszować istniejący skrypt w celu wykonania opakowania lub podstawienia polecenia PATH, .bashrcbędzie to działać w zależności od szczegółów wykonania. Jeśli nie, można zamiast tego wykonać skrypt otoki, że po prostu robi .lub sourcez include plik, który definiuje funkcje, a następnie robi to samo ze skryptem powłoki z poleceń może być podstawiona.
Skrypt opakowania może wyglądać następująco:
script=$1
shift
. include.sh
. $script "$@"
Chodzi o to, że pierwszym parametrem jest nazwa prawdziwego skryptu, a pozostałe parametry to argumenty, a zamiast tego uruchamiany jest powyższy skrypt.
declare -x -f NAME
Więcej informacji
-f ogranicza akcję lub wyświetlanie do nazw funkcji i definicji -x, aby wyeksportować NAZWY
bash . ( ksh„S odpowiednik declare, typesetma takie -xmożliwości, ale ma on zastosowanie wyłącznie do zmiennych , a nie funkcji; samo dotyczy zsh).