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?
czy funkcja eksportowana jest dostępna tylko dla połączeń potomnych? Jak zastosować to do bieżącej sesji basha? lubię pisać .bashrc, ale tylko dla bieżącej instancji basha ...
vp_arth
3
@vp_arth: Jeśli nie potrzebujesz funkcji w wywołaniach potomnych, nie musisz jej eksportować. W obu przypadkach jest on dostępny w bieżącej sesji (zwróć uwagę, że jeśli jest zdefiniowany w pliku, musisz go pobrać, a nie uruchamiać, aby był dostępny w bieżącej sesji).
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.
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=$1shift
. 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.
Należy pamiętać, że jest to specyficzne dlabash . ( ksh„S odpowiednik declare, typesetma takie -xmożliwości, ale ma on zastosowanie wyłącznie do zmiennych , a nie funkcji; samo dotyczy zsh).
mklement0
0
Funkcje z natury nie mogą być eksportowane. Możesz jednak eksportować ciągi, więc mam tutaj małą sztuczkę:
func="$(typeset -f funcname)"export func
Aby zaimportować funkcję, zdefiniuj ją ponownie z wyeksportowanego ciągu:
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)) )
źródło
W
sh
, to nie można eksportować funkcję, jak zauważył Charles Duffy .źródło
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 wPATH
, 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 wymaganeFPATH
do działania.ksh
Wierzę, że w programie In i jego bliskich krewnych po prostu powoduje, że funkcje zdefiniowane w programieFPATH
zastępują zwykłe polecenia w twojej PATH, tak jakby były zdefiniowane bezpośrednio.Kilka szczegółów na temat
FPATH
iautoload
:źródło
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.
lubsource
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.
źródło
declare -x -f NAME
Więcej informacji
źródło
bash
. (ksh
„S odpowiednikdeclare
,typeset
ma takie-x
możliwości, ale ma on zastosowanie wyłącznie do zmiennych , a nie funkcji; samo dotyczyzsh
).Funkcje z natury nie mogą być eksportowane. Możesz jednak eksportować ciągi, więc mam tutaj małą sztuczkę:
func="$(typeset -f funcname)" export func
Aby zaimportować funkcję, zdefiniuj ją ponownie z wyeksportowanego ciągu:
# in subshell eval "$func"
źródło