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 -f
funkcja 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 FPATH
jest 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ć autoload
polecenia w skryptach powłoki, aby załadować wymagane funkcje:
autoload fun_a fun_b
W zsh autoload
jest wymagane FPATH
do działania. ksh
Wierzę, że w programie In i jego bliskich krewnych po prostu powoduje, że funkcje zdefiniowane w programie FPATH
zastępują zwykłe polecenia w twojej PATH, tak jakby były zdefiniowane bezpośrednio.
Kilka szczegółów na temat FPATH
i 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, .bashrc
bę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 source
z 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
, typeset
ma takie -x
możliwości, ale ma on zastosowanie wyłącznie do zmiennych , a nie funkcji; samo dotyczy zsh
).