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 "$@"
}

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

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.


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.


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!

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.