Eksportowanie funkcji w powłoce

87

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?

Sachin Chourasiya
źródło
1
unix.stackexchange.com/questions/22796/…
Ciro Santilli 郝海东 冠状 病 六四 事件 法轮功

Odpowiedzi:

105

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)) )
Wstrzymano do odwołania.
źródło
2
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).
Wstrzymano do odwołania.
3

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:

Venkataramesh Kommoju
źródło
1

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.

DigitalRoss
źródło
2
Czy mógłbyś wyjaśnić to na przykładzie kodowania. Nie chcę umieszczać mojej funkcji w .bashrc
Sachin Chourasiya
1
declare -x -f NAME

Więcej informacji

-f ogranicza akcję lub wyświetlanie do nazw funkcji i definicji
-x, aby wyeksportować NAZWY
Steven Penny
źródło
6
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:

# in subshell
eval "$func"
iBug
źródło