2010-07-07 16 views

Odpowiedz

12

Jeśli chcesz zobaczyć, jak bash builtins są zdefiniowane wtedy po prostu trzeba spojrzeć na Section 4 of The Bash Man Page.

Jeśli jednak chcesz wiedzieć, jak bash bultins są realizowane, trzeba spojrzeć na the Bash source code ponieważ polecenia te są kompilowane do pliku wykonywalnego bash.

Jednym szybkim i łatwym sposobem sprawdzenia, czy polecenie jest wbudowane w bash, jest użycie polecenia help. Przykład: help cd pokaże ci, jak zdefiniowany jest bash zbudowany z 'cd'. Podobnie dla help echo.

3

Manjari, Sprawdź kod źródłowy powłoki bash z ftp://ftp.gnu.org/gnu/bash/bash-2.05b.tar.gz Znajdziecie że definicja skorupy wbudowanych komend w nie w osobnym pliku wykonywalnego binarnego, ale jego obrębie samego binarnym powłoki (nazwa powłoki wbudowany wyraźnie sugeruje to).

1

Wykonany z powłoki - http://linux.about.com/library/cmd/blcmdl1_builtin.htm dla np. -

which cd 
/usr/bin/which: no cd in (/usr/bin:/usr/local/bin...... 

Nie wbudowana powłoka, ale binarna.

which ls 
/bin/ls 
+2

Nie do końca prawda - czasami nakładki i pliki wykonywalne nakładają się, np. chociaż istnieje program "/ bin/echo", większość powłok udostępnia własny wbudowany 'echo'. –

+0

inny przykład to "czas" –

11

Rzeczywisty zestaw wbudowanych różni się w zależności od powłoki. Są to:

  • Special built-in utilities, która musi być wbudowany, ponieważ mają pewne szczególne właściwości
  • Regular built-in utilities, które niemal zawsze są wbudowane, ze względu na wydajność lub inne względy
  • Wszelkie standardowy użytkowego może być również wbudowany, jeśli chce tego realizator powłoki.

Możesz dowiedzieć się, czy narzędzie zostało wbudowane za pomocą polecenia type, które jest obsługiwane przez większość powłok (chociaż jego wynik nie jest standaryzowany). Przykład z dash:

$ type ls 
ls is /bin/ls 
$ type cd 
cd is a shell builtin 
$ type exit 
exit is a special shell builtin 

Re cd narzędzie, teoretycznie nie ma nic zapobiegania realizatora powłoki do wdrożenia go jako zewnętrznego polecenia. cd nie może bezpośrednio zmienić bieżącego katalogu powłoki, ale na przykład cd może przekazać nowy katalog do procesu powłoki za pośrednictwem gniazda. Ale nikt tak nie robi, ponieważ nie ma sensu. Z wyjątkiem bardzo starych powłok (gdzie nie było pojęcia wbudowanych), gdzie cd używał jakiegoś brudnego hacka systemowego, aby wykonać swoją pracę.

W jaki sposób zaimplementowano w powłoce cd? Podstawowy algorytm jest opisany here. Może również wykonać pewne prace, aby wesprzeć dodatkowe funkcje powłoki.

2

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ę.

Powiązane problemy