Początkowo szukałem przyczyny, która which
nic nie wypisuje po podaniu pewnych programów jako argumentu, np cd
.
Z tego, co tu znalazłem , prawdopodobnie przyczyną jest to, że cd
na mojej maszynie jest funkcja, która jest potwierdzona przez uruchomienie type cd
.
TLDR: Ale jak zwykłe programy, które which
mogą zlokalizować dzięki $PATH
zmiennej, są umieszczone w jednym z tych $PATH
folderów, gdzie cd
przechowywane są funkcje lub skrypty ?
user@linuxmchine:~$ type cd
cd is a function
cd ()
{
__zsh_like_cd cd "$@"
}
linux
bash
shell-script
Gabrijel Šimunović
źródło
źródło
cd is a shell builtin
. Spójrz na stronę podręcznika użytkownika swojej powłoki (zsh?)Odpowiedzi:
Funkcje zdefiniowane przez użytkownika
Zazwyczaj funkcje bash są trwale przechowywane w
bash
skrypcie startowym./etc/profile
dla powłok logowania i/etc/bashrc
dla interaktywnych powłok.~/.bash_profile
dla powłok logowania i~/.bashrc
dla interaktywnych powłok.man
stronie 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.c
definicja tabeli jest następująca:Funkcje zdefiniowane przez użytkownika można wyświetlić za pomocą
declare
polecenia bash , inne powłoki nadal używajątypeset
. W bashdeclare
zastąpiłtypeset
polecenie.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
,cd
i:
. Są one kompilowane w bibliotekę połączoną zbash
plikiem wykonywalnym. Wbudowanie definicji w plik wykonywalny oszczędza czas w porównaniu z ładowaniem definicji zewnętrznej. Definicje tych funkcji (przechowywane w.def
plikach źródłowych, które są parsowane do źródła C) są przechowywane wbuiltins
katalogu źródła bash.Przydatne: dla informacji o wbudowanym poleceniu powłoki
help <command>
. na przykładźródło
typeset
pokazuje, który plik / skrypt spowodował utworzenie / zmianę funkcji?declare
lub,typeset
aby wyświetlić plik źródłowy definicji funkcji. Myślę, że to problem inżynierii oprogramowania. Ostatnio znalazłem funkcję powłoki zdefiniowaną w.alias
pliku - nie tego się spodziewałem!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_profile
lub coś podobnego) i przestają istnieją po zakończeniu powłoki.źródło
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).cd
i inne polecenia wspólne podobaecho
,type
ialias
są tak zwane pomocy poleceń wbudowanych .Wbudowane polecenia są zawarte w samej powłoce, a różne powłoki mogą mieć różne wbudowane polecenia.
źródło
cd
jest zawarty w samym programie powłoki, np. W pliku,/bin/bash
jeś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.)Pytanie superużytkownika Znalezienie definicji funkcji bash jest ściśle z nią związane. Użytkownik HairOfTheDog podał tę odpowiedź (parafrazując):
Powyższe może działać tylko w
bash
powłokach POSIX, a nie ogólnie.Dzięki Blue Raspberry za znalezienie tego!
źródło