Eksportowanie funkcji w powłoce


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)) )

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:


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.


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

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"
Korzystając z naszej strony potwierdzasz, że przeczytałeś(-aś) i rozumiesz nasze zasady używania plików cookie i zasady ochrony prywatności.
Licensed under cc by-sa 3.0 with attribution required.