Z twoich komentarzy wydaje się, że nie rozumiesz dokładnie, czym jest powłoka . Jądro jest odpowiedzialne za zarządzanie systemem. Jest to część, która faktycznie ładuje i uruchamia programy, uzyskuje dostęp do plików, przydziela pamięć itp. Ale jądro nie ma interfejsu użytkownika; możesz się z nim komunikować tylko za pomocą innego programu jako pośrednika.
Powłoka to program, który drukuje monit, odczytuje wiersz danych wejściowych, a następnie interpretuje go jako jedno lub więcej poleceń do manipulowania plikami lub uruchamiania innych programów. Przed wynalezieniem GUI powłoka była podstawowym interfejsem użytkownika systemu operacyjnego. W MS-DOS wywołano powłokę command.com
i niewiele osób próbowało użyć innej. Jednak w Uniksie od dawna istnieje wiele powłok, z których użytkownicy mogą wybierać.
Można je podzielić na 3 typy. Powłoki kompatybilne z Bourne używają składni pochodzącej z oryginalnej powłoki Bourne . Muszli C stosować składnię z pierwotnej powłoki C . Są też nietradycyjne powłoki, które wymyślają własną składnię lub pożyczają jedną z jakiegoś języka programowania i są na ogół znacznie mniej popularne niż dwa pierwsze typy.
Wbudowane polecenie jest po prostu poleceniem wykonywanym przez powłokę, zamiast interpretować ją jako żądanie załadowania i uruchomienia innego programu. Ma to dwa główne efekty. Po pierwsze, zwykle jest szybszy, ponieważ ładowanie i uruchamianie programu wymaga czasu. Oczywiście im dłużej trwa uruchomienie polecenia, tym mniej znaczący jest czas ładowania w porównaniu do całkowitego czasu pracy (ponieważ czas ładowania jest dość stały).
Po drugie, wbudowane polecenie może wpływać na wewnętrzny stan powłoki. Dlatego polecenia takie cd
muszą być wbudowane, ponieważ zewnętrzny program nie może zmienić bieżącego katalogu powłoki. Inne polecenia, na przykład echo
, mogą być wbudowane w celu zwiększenia wydajności, ale nie ma żadnego wewnętrznego powodu, że nie mogą to być polecenia zewnętrzne.
To, które polecenia są wbudowane, zależy od używanej powłoki. Będziesz musiał zapoznać się z jego dokumentacją, aby uzyskać listę (np. bash
Wbudowane polecenia są wymienione w rozdziale 4 podręcznika ). type
Polecenie może powiedzieć, czy polecenie jest wbudowane (jeśli powłoka jest zgodny z POSIX), ponieważ POSIX wymaga, by type
być wbudowane. Jeśli which
nie jest wbudowany w twoją powłokę, to prawdopodobnie nie będzie wiedział o wbudowanych powłokach, ale będzie po prostu szukał programów zewnętrznych.
Istnieją trzy poziomy wbudowanych narzędzi:
Niektóre narzędzia są naprawdę częścią powłoki jako języka programowania, mimo że nie są to słowa zastrzeżone . Są narzędzia sterowania przepływem (
.
,:
,break
,continue
,return
,trap
,exit
,exec
,eval
), odnoszące się do parametrów narzędzia (set
,unset
,shift
,export
,readonly
,local
đ,typeset
ą), alias media (alias
²unalias
²) itimes
ł. Te specjalne wbudowane rozwiązania są traktowane w specjalny sposób:foo=bar utility
ma inne znaczenie: jest zwykłym przypisaniem parametru (tj. Równoważnymfoo=bar; utility
), zamiast przypisywania do środowiska tylko na czas działania narzędzia.Niektóre narzędzia muszą być zaimplementowane w powłoce, ponieważ działają na jej wewnętrzne ustawienia. To zawiera:
cd
,dirs
,pushd
,popd
;bg
,disown
,fg
,jobs
,wait
;builtin
,command
,hash
,read
,type
,ulimit
,umask
;fc
,history
,bind
.echo
,printf
,test
,true
,false
.Zaawansowane powłoki, takie jak bash , ksh i zsh, zwykle mają więcej wbudowanych funkcji, często w celu implementacji niestandardowych funkcji (zwykle do interakcji). Instrukcja każdej powłoki powie ci, jakie polecenia są wbudowane, chociaż niektóre powłoki ( przynajmniej Zsh ) obsługują moduły ładowane dynamicznie, które mogą zapewnić więcej wbudowanych.
¹ Nieznany POSIX, ale specjalny w ksh i kilku innych powłokach.
² Zwykłe w POSIX, ale specjalne w ksh i kilku innych powłokach.
³ W
ksh
,times
jest otoczeniemtime
słowa kluczowego: to alias dla{ { time;} 2>&1;}
. Zauważ, że POSIX pozwalatime
być zewnętrznym narzędziem ze zwykłym parsowaniem lub słowem kluczowym, które dotyczy całego potoku (który jest w ksh, bash w zsh).źródło
while IFS= read -r line
?read
nie jest specjalnym programem wbudowanym, dlategoIFS=read
ustawia zmienną tylko na czas trwania polecenia.Wbudowane to polecenie dostarczone przez powłokę, a nie przez zewnętrzny program. Oto lista
bash
poleceń wbudowanych (są one również wymienione na stronie podręcznika bash) izsh
poleceń wbudowanych .ksh
zapewnia listę przez uruchomieniebuiltin
.Aby wiedzieć, czy określone polecenie jest wbudowane, możesz uruchomić
type command
. Spróbowaćtype for
itype ls
zobaczyć.źródło
type
wydaje się załatwić sprawę; dzięki za to ... ale wciąż zastanawiam się, co znaczy "zapewnione przez powłokę" ... Być może muszę lepiej zrozumieć, w jaki sposób powłoka odnosi się do jądra .... ale nie o drugiej w nocy. Przyjdę wracam do jutraKażda dystrybucja i powłoka ma inną kolekcję poleceń niż wbudowane funkcje powłoki. Ogólnie chodzi o to, że powłoki wbudowane są w najczęstsze i najprostsze funkcje, aby zaoszczędzić czas, szybkość i zintegrować wolę z resztą zestawu funkcji. Narzut jest znacznie niższy, ponieważ nie musi uruchamiać innego procesu systemowego. Można jednak mieszać i dopasowywać. Możesz uruchomić jedną powłokę, która ma wbudowaną funkcję, ale masz to polecenie również w systemie. Zwykle wbudowane ma priorytet, ale można to kontrolować.
Możesz łatwo dowiedzieć się, czy określone polecenie jest wbudowane, czy nie, uruchamiając
type mycommand
. Większość stron podręcznika powłoki ma również listę swoich wbudowanych funkcji.Edycja: Użyj,
type
aby dowiedzieć się, czy polecenie jest wbudowane, a jeśli nie,which
aby dowiedzieć się, skąd zostanie wykonane.źródło
=>"/bin/echo" and
typ echa echo=>"echo is a shell builtin", but 'which dd
=> „/ bin / dd” itype dd
=> „dd is / bin / dd” ... więc jestem częściowo tam ....type
lepszym wskaźnikiem tego, co jest uruchamiane , jest lepszy, ale zauważasz, żeecho
jest on zarówno wbudowany, jak i istnieje aplikacja o tej nazwie. Gdyby twoja powłoka nie miała wbudowanego systemu, można by ją uruchomić.which
niekoniecznie jest wbudowanym poleceniem, a jeśli nie, nie będzie wiedział o wbudowanych powłokach. POSIX wymagatype
wbudowanego polecenia, więc zawsze wie o wbudowanych.which
dotype
lub jakimś zestawem opcji, np.alias which='type -path'
- może to być źródłem zamieszania.which
zostanie zastąpione przeztype
. Korzystałem z tego, co w kółko, nie wiedząc o tymtype
i byłem bardzo zdumiony, żewhich
to słuszne, gdy decyduję między programami.