bash
W moim ~/.bashrc
pliku zdefiniowałem funkcję . To pozwala mi używać go w terminalach powłokowych. Jednak wydaje się, że nie istnieje, gdy wywołuję go ze skryptu.
Jak mogę zdefiniować bash
funkcję, która będzie używana także przez skrypty?
bash
shell-script
function
Onturenio
źródło
źródło
/bin/sh
linii shebang?Odpowiedzi:
~/.bash_profile
i~/.bashrc
nie są odczytywane przez skrypty, a funkcje nie są domyślnie eksportowane. Aby to zrobić, możesz użyćexport -f
:export -f foo
można również wywołać w~/.bash_profile
celu udostępnienia tej funkcji skryptom po zalogowaniu. Ostrzegam, żeexport -f
nie jest przenośny.Lepszym rozwiązaniem byłoby źródło pliku zawierającego funkcję
. file
. Jest to o wiele bardziej przenośne i nie zależy od skonfigurowania środowiska w określony sposób.źródło
function myFunction { ... }
w~/.bash_profile
i jesteś gotowy?export
wydaje się , że rozwiązanie działa poprawnie. Dzięki.foo
funkcji zfile
2) Możesz lepiej kontrolować jego zawartośćfile
niż upewnić się, że wywołująca powłoka nie zmieniło sięfoo
przed wywołaniem skryptu. Możesz na przykład dodać kontrole bezpieczeństwa,file
aby upewnić się, że nie są naruszone. (niełatwe, ale możliwe). (cóż, możesz również wykonać te kontrole zdefiniowanej funkcji foo ... ale dostajesz mój dryf ^^ Myślę, że metoda 2 jest czystsza.) 3)file
będzie zawierała tylko to, co jest potrzebne, a nie więcej..bashrc
jest odczytywany tylko przez interaktywne powłoki. (Faktycznie, to nadmierne uproszczenie: bash jest nietypowy pod tym względem atakujących nie czyta..bashrc
Czy jest to powłoka logowania, interaktywne czy nie i nie ma wyjątku nawet wyjątku. Jeśli proces nadrzędny Bash jestrshd
lubsshd
, a następnie bash czyta.bashrc
, czy to interaktywne czy nie.)Umieść definicje funkcji w pliku w znanym miejscu i użyj wbudowanej
.
(także pisownisource
) wbudowanej, aby dołączyć ten plik do skryptu.Jeśli chcesz, możesz śledzić funkcję automatycznego ładowania ksh. Umieść każdą definicję funkcji w pliku o tej samej nazwie co funkcja. Wyświetl katalogi zawierające definicje funkcji w
FPATH
zmiennej (lista katalogów oddzielona dwukropkami). Oto przybliżone przybliżenie ksh,autoload
które faktycznie ładuje funkcję natychmiast zamiast na żądanie:źródło
Czy potrzebujemy funkcję? Jeśli nie, rozważ wyciągnięcie logiki do osobnego, samodzielnego skryptu Bash w swoim
$PATH
. Na przykład miałem to w moim~/.bashrc
:~/bin
jest w mojej$PATH
, więc utworzyłem~/bin/wanip
z następującą zawartością:I pobiegł,
chmod 0755 ~/bin/wanip
aby był wykonywalny. Teraz mogę wykonaćwanip
z innych skryptów.Lubię mieć
wanip
w samodzielnym skrypcie Bash. Przypomina mi, że chcę, aby ta logika była ogólnie dostępna (poza tym w mojej bieżącej interaktywnej sesji Bash). Skrypt ładnie zawiera logikę i dokumentację.źródło