Gdzie są przechowywane funkcje powłoki w systemie Linux?

11

Początkowo szukałem przyczyny, która whichnic nie wypisuje po podaniu pewnych programów jako argumentu, np cd.

Z tego, co tu znalazłem , prawdopodobnie przyczyną jest to, że cdna mojej maszynie jest funkcja, która jest potwierdzona przez uruchomienie type cd.

TLDR: Ale jak zwykłe programy, które whichmogą zlokalizować dzięki $PATHzmiennej, są umieszczone w jednym z tych $PATHfolderów, gdzie cdprzechowywane są funkcje lub skrypty ?

user@linuxmchine:~$ type cd
cd is a function
cd () 
{ 
    __zsh_like_cd cd "$@"
}
Gabrijel Šimunović
źródło
I dostać cd is a shell builtin. Spójrz na stronę podręcznika użytkownika swojej powłoki (zsh?)
Xen2050,
1
Sprawdź unix.stackexchange.com/questions/85249/… Problem polega na tym, że jest to starsze polecenie, którego nie należy używać - szczególnie z powodu takich pytań jak to.
Joe

Odpowiedzi:

12

Funkcje zdefiniowane przez użytkownika

Zazwyczaj funkcje bash są trwale przechowywane w bashskrypcie startowym.

  • Systemowe skrypty startowe: /etc/profiledla powłok logowania i /etc/bashrcdla interaktywnych powłok.
  • Użytkownik definiuje skrypty startowe: ~/.bash_profiledla powłok logowania i ~/.bashrcdla interaktywnych powłok.
  • Więcej informacji na temat powłok interaktywnych / logowania można znaleźć na manstronie bash w dziale WYWOŁANIE.

Funkcje powłoki zdefiniowane przez użytkownika są ładowane dynamicznie w haszu (lub tabeli odnośników), gdy rozpoczyna się bash. Z pliku źródłowego bash variable.cdefinicja tabeli jest następująca:

/* The list of shell functions that the user has created, or that came from
   the environment. */
HASH_TABLE *shell_functions = (HASH_TABLE *)NULL;

Funkcje zdefiniowane przez użytkownika można wyświetlić za pomocą declarepolecenia bash , inne powłoki nadal używają typeset. W bash declarezastąpił typesetpolecenie.

declare -f

Funkcje istnieją w pamięci przez cały okres użytkowania powłoki bash.

Funkcje zdefiniowane przez powłokę (wbudowane)

Są to typowe funkcje takie jak echo, printf, cdi :. Są one kompilowane w bibliotekę połączoną z bashplikiem wykonywalnym. Wbudowanie definicji w plik wykonywalny oszczędza czas w porównaniu z ładowaniem definicji zewnętrznej. Definicje tych funkcji (przechowywane w .defplikach źródłowych, które są parsowane do źródła C) są przechowywane w builtinskatalogu źródła bash.

Przydatne: dla informacji o wbudowanym poleceniu powłoki help <command>. na przykład

help                # list all builtins
help declare        # info and options for declare
help -m declare     # gives man style information for declare
podejrzenie
źródło
Dziękuję za tę odpowiedź. Właśnie tego szukałem. Czy uważasz, że istnieje narzędzie do śledzenia procesu tworzenia funkcji bash, czy coś takiego typesetpokazuje, który plik / skrypt spowodował utworzenie / zmianę funkcji?
Gabrijel Šimunović
Nie znam takiego narzędzia - byłaby przydatna opcja dla polecenia declarelub, typesetaby wyświetlić plik źródłowy definicji funkcji. Myślę, że to problem inżynierii oprogramowania. Ostatnio znalazłem funkcję powłoki zdefiniowaną w .aliaspliku - nie tego się spodziewałem!
podejrzany
8

Funkcje powłoki są przechowywane w pamięci powłoki (lub być może w nieudokumentowanych plikach tymczasowych). Oni nie istnieją w każdym użytkowej drodze do chwili uruchomienia powłoki (na przykład podczas logowania do CLI, lub uruchomić okno takie jak powłoki xterm) i są one zdefiniowane (np czytając .bashrc, .bash_profilelub coś podobnego) i przestają istnieją po zakończeniu powłoki.

G-Man mówi „Przywróć Monikę”
źródło
1
Istotna jest efemeryczna natura tekstu, który wpisujesz po znaku zachęty. Głosuję na tę odpowiedź. Jeśli wpiszesz cd () { pwd; builtin cd "$@"; }w wierszu polecenia, jedynym miejscem, które jest przechowywane, jest pamięć aktualnie uruchomionej powłoki. (Mój przykład to Bash, ale ta sama zasada ma zastosowanie do każdej powłoki).
tripleee
6

cdi inne polecenia wspólne podoba echo, typei aliassą tak zwane pomocy poleceń wbudowanych .

Wbudowane polecenia są zawarte w samej powłoce, a różne powłoki mogą mieć różne wbudowane polecenia.

Nifle
źródło
4
Nie wiem, czy warto podkreślić, że kod wykonywalny wbudowanych poleceń, takich jak, cdjest zawarty w samym programie powłoki, np. W pliku, /bin/bashjeśli jest to twoja powłoka. (Myślę, że twoje sformułowanie tutaj jest jasne, ale widziałem, jak ludzie są zdezorientowani różnymi rzeczami.)
David Z
1

Pytanie superużytkownika Znalezienie definicji funkcji bash jest ściśle z nią związane. Użytkownik HairOfTheDog podał tę odpowiedź (parafrazując):

Następujące polecenia podadzą lokalizację (nazwę pliku i numer wiersza) definicji funkcji. Zakładając funkcję o nazwie foo,

# Turn on extended shell debugging
shopt -s extdebug

# Display the function’s name, line number and fully qualified source file
declare -F foo

# Turn off extended shell debugging
shopt -u extdebug

Na przykład dane wyjściowe tych poleceń mogą wyglądać następująco:

foo 32 /source/private/main/developer/cue.pub.sh

Powyższe może działać tylko w bashpowłokach POSIX, a nie ogólnie.

Dzięki Blue Raspberry za znalezienie tego!

G-Man
źródło