Jaka jest różnica między wbudowanym poleceniem a tym, które nie jest?


72

Czy istnieje jakaś istotna różnica między wbudowanym poleceniem a innym poleceniem, które może nominalnie zrobić to samo?

na przykład. Czy wbudowane funkcje są traktowane „specjalnie”? ... czy zarządza nimi mniej kosztów ogólnych? .. czy są po prostu „wbudowane”; jak deska rozdzielcza twojego samochodu?

... i czy istnieje ostateczna (bieżąca) lista tych wbudowanych funkcji?

Odpowiedzi:


90

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.comi 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. bashWbudowane polecenia są wymienione w rozdziale 4 podręcznika ). typePolecenie może powiedzieć, czy polecenie jest wbudowane (jeśli powłoka jest zgodny z POSIX), ponieważ POSIX wymaga, by typebyć wbudowane. Jeśli whichnie 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.


W rzeczywistości aplikacje komunikują się z jądrem poprzez wydawanie przerwań.
Nathan Osman

11
@George: Aplikacje komunikują się z jądrem poprzez wydawanie wywołań systemowych, które w zależności od systemu operacyjnego i architektury mogą używać przerwań. Użytkownicy z reguły nie wydają przerwań.
Gilles

2
@cjm: To brzmi tak prosto, kiedy to wytłumaczysz:) ... z pewnością pomogłeś oczyścić mgłę ... teraz tylko lekka mgła .. (właściwie taka jest pogoda tutaj dziś rano. .. przyjemnie mglisty;) ... dzięki
Peter.O

@Gilles: Naprawdę? Myślałem, że wszystkie programy trybu użytkownika komunikują się z jądrem za pomocą przerwań (oczywiście w niektórych architekturach).
Nathan Osman

2
@cjm Bardzo dokładna i pouczająca odpowiedź. Dużo się nauczyłem, czytając to. :)
ankush981

37

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²) i timesł. Te specjalne wbudowane rozwiązania są traktowane w specjalny sposób:

    • Jeśli przekażesz nieprawidłowe argumenty do specjalnego wbudowanego, sama powłoka może przerwać, zamiast po prostu przejść do następnego polecenia po wyświetleniu komunikatu o błędzie.
    • Składnia przed przypisaniem foo=bar utilityma inne znaczenie: jest zwykłym przypisaniem parametru (tj. Równoważnym foo=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:

    • narzędzia, które działają na aktualnym katalogu powłoki, takie jak cd, dirs, pushd, popd;
    • narzędzia kontrolne, takie jak praca bg, disown, fg, jobs, wait;
    • Narzędzia odczytujących lub manipulowania inne atrybuty, takie jak powłoki builtin, command, hash, read, type, ulimit, umask;
    • narzędzia związane z interaktywnych funkcji, gdy są obecne, takie jak fc, history, bind.
  • Niektóre narzędzia są zwykle realizowane jako wbudowane-ins wyłącznie do wykonywania : 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, timesjest otoczeniem timesłowa kluczowego: to alias dla { { time;} 2>&1;}. Zauważ, że POSIX pozwala timebyć 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).


3
Te wyróżnienia są naprawdę ważne.
dmckee,

Szybkie pytanie, co więc oznacza „zwykłe przypisanie parametrów”, kiedy to robimy while IFS= read -r line?
Sergiy Kolodyazhnyy

@SergiyKolodyazhnyy readnie jest specjalnym programem wbudowanym, dlatego IFS=readustawia zmienną tylko na czas trwania polecenia.
Gilles

10

Wbudowane to polecenie dostarczone przez powłokę, a nie przez zewnętrzny program. Oto lista bashpoleceń wbudowanych (są one również wymienione na stronie podręcznika bash) i zshpoleceń wbudowanych . kshzapewnia listę przez uruchomienie builtin.

Aby wiedzieć, czy określone polecenie jest wbudowane, możesz uruchomić type command. Spróbować type fori type lszobaczyć.


typewydaje 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 jutra
Peter.O

1

Każ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, typeaby dowiedzieć się, czy polecenie jest wbudowane, a jeśli nie, whichaby dowiedzieć się, skąd zostanie wykonane.


@Caleb: dzięki za komentarz, ale zastanawiam się, co to właściwie jest „proces systemowy”. Ciągle widzę odniesienia do tego, ale nie rozumiem, gdzie leży różnica… (btw nie mogę zobacz jak „który” jest wskaźnikiem absolutnym) .. np.… jaki =>"/bin/echo" and typ echa echo =>"echo is a shell builtin", but 'which dd=> „/ bin / dd” i type dd=> „dd is / bin / dd” ... więc jestem częściowo tam ....
Peter.O

„System Proceps” oznacza po prostu, że jest uruchamiany jako niezależna aplikacja zarządzana przez jądro. Alternatywą w przypadku wbudowanych funkcji jest po prostu uruchomienie podfunkcji w już działającym kodzie powłoki. W podanym przykładzie typelepszym wskaźnikiem tego, co jest uruchamiane , jest lepszy, ale zauważasz, że echojest 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ć.
Caleb

2
whichniekoniecznie jest wbudowanym poleceniem, a jeśli nie, nie będzie wiedział o wbudowanych powłokach. POSIX wymaga typewbudowanego polecenia, więc zawsze wie o wbudowanych.
cjm

Wiele systemów jest dostarczanych z aliasem whichdo typelub jakimś zestawem opcji, np. alias which='type -path'- może to być źródłem zamieszania.
Random832 16.04.11

1
Nie mogę głosować za tym, dopóki nie whichzostanie zastąpione przez type. Korzystałem z tego, co w kółko, nie wiedząc o tym typei byłem bardzo zdumiony, że whichto słuszne, gdy decyduję między programami.
użytkownik nieznany
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.