Każda powłoka Uniksa ma przynajmniej kilka wbudowanych poleceń. Te wbudowane polecenia są częścią powłoki i są implementowane jako część kodu źródłowego powłoki. Powłoka rozpoznaje, że polecenie, którego wykonania zażądano, było jednym z jej wbudowań i wykonuje tę czynność samodzielnie, bez wywoływania osobnego pliku wykonywalnego. Różne powłoki mają różne wbudowane, chociaż w zestawie podstawowym będzie dużo nakładek.
Czasami wbudowane są wbudowane ze względu na wydajność. W tym przypadku często jest też wersja tego polecenia w $PATH
(prawdopodobnie z innym zestawem funkcji, innym zestawem rozpoznanych argumentów wiersza poleceń itd.), Ale powłoka zdecydowała się zaimplementować polecenie jako wbudowane, aby mogło ono ocalić dzieło odrodzenia krótkotrwałego procesu, aby wykonać jakąś pracę, którą sam mógłby zrobić. To jest przypadek bash i printf np
$ type printf
printf is a shell builtin
$ which printf
/usr/bin/printf
$ printf
printf: usage: printf [-v var] format [arguments]
$ /usr/bin/printf
/usr/bin/printf: missing operand
Try `/usr/bin/printf --help' for more information.
Należy zauważyć, że w powyższym przykładzie printf jest zarówno powłoki wbudowane (realizowane jako część samego bash), a także polecenia zewnętrznego (zlokalizowany w/usr/bin/printf). Zauważ, że zachowują się one również inaczej - po wywołaniu bez argumentów wbudowana wersja i wersja komendy drukują różne komunikaty o błędach. Zauważ także opcję -v var
(zapisz wyniki tego printf do zmiennej powłoki o nazwie var
) można wykonać tylko jako część powłoki - podprocesy takie jak/usr/bin/printf nie mają dostępu do zmiennych powłoki, która je wykonała.
I to prowadzi nas do drugiej części historii: niektóre polecenia są wbudowane, ponieważ muszą być. Niektóre polecenia, takie jak chmod
, są cienkimi opakowaniami wokół wywołań systemowych. Po uruchomieniu /bin/chmod 777 foo
, widły powłoki, execs/bin/chmod (przekazując "777" i "foo") jako argumenty, a nowy proces chmod uruchamia kod C chmod("foo", 777);
, a następnie zwraca kontrolę do powłoki. Nie zadziałałoby to jednak dla polecenia cd
. Mimo że cd
wygląda tak samo jak w przypadku chmod
, musi zachowywać się inaczej: jeśli powłoka zainicjuje inny proces w celu wykonania wywołania systemowego chdir
, zmieni katalog tylko dla tego nowo zainicjowanego procesu, a nie powłoki. Następnie, gdy proces zostanie zwrócony, powłoka zostanie pozostawiona w tym samym katalogu, w którym była od początku - dlatego też musi być zaimplementowana jako wbudowana w powłokę.
To nie ma nic wspólnego z jądrem. –