Mỗi trình bao Unix có ít nhất một số lệnh nội trang. Các lệnh dựng sẵn này là một phần của trình bao và được triển khai như là một phần của mã nguồn của trình bao. Shell nhận ra rằng lệnh mà nó được yêu cầu thực thi là một trong các nội trang của nó, và nó thực hiện hành động đó một cách riêng của nó, mà không cần gọi ra một tệp thực thi riêng biệt. Các shell khác nhau có các nội trang khác nhau, mặc dù sẽ có rất nhiều chồng chéo trong tập hợp cơ bản.
Đôi khi, nội trang dựng sẵn được xây dựng vì lý do hiệu suất. Trong trường hợp này, thường có một phiên bản của lệnh đó trong $PATH
(có thể với một tập hợp tính năng khác, tập hợp các đối số dòng lệnh được công nhận khác nhau, v.v.), nhưng trình vỏ đã quyết định thực hiện lệnh dưới dạng một bản dựng sẵn để nó có thể tiết kiệm công việc sinh sản trong một quá trình ngắn ngủi để làm một số công việc mà nó có thể tự làm. Đó là trường hợp đối với bash và printf, ví dụ:
$ 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.
Lưu ý rằng trong ví dụ trên, printf vừa là một vỏ BUILTIN (thực hiện như một phần của bash chính nó), cũng như một lệnh bên ngoài (nằm tại/usr/bin/printf). Lưu ý rằng chúng cũng hoạt động khác nhau - khi được gọi không có đối số, phiên bản nội trang và phiên bản lệnh in các thông báo lỗi khác nhau. Cũng lưu ý tùy chọn -v var
(lưu trữ kết quả của printf này vào biến shell có tên là var
) chỉ có thể được thực hiện như một phần của shell - subprocesses như/usr/bin/printf không có quyền truy cập vào các biến của shell đã thực thi chúng.
Và điều đó đưa chúng ta đến phần thứ hai của câu chuyện: một số lệnh được xây dựng bởi vì chúng cần phải có. Một số lệnh, như chmod
, là các trình bao bọc mỏng xung quanh các cuộc gọi hệ thống. Khi bạn chạy /bin/chmod 777 foo
, dĩa vỏ, execs/bin/chmod (chuyển "777" và "foo") làm đối số và quá trình chmod mới chạy mã C chmod("foo", 777);
và sau đó trả về điều khiển cho trình bao. Tuy nhiên, điều này sẽ không hoạt động với lệnh cd
. Mặc dù cd
trông giống như trường hợp chmod
, nó phải hoạt động khác: nếu shell sinh ra một quá trình khác để thực hiện cuộc gọi hệ thống chdir
, nó sẽ thay đổi thư mục chỉ cho quy trình mới được tạo ra đó chứ không phải trình bao. Sau đó, khi quá trình quay trở lại, trình bao sẽ bị bỏ lại trong cùng một thư mục giống như nó đã từng tồn tại - do đó, cd
cần phải được triển khai như một nội trang hệ vỏ.
Điều này không liên quan gì đến hạt nhân. –