2010-07-07 34 views
13

Tôi vừa mới bắt đầu sử dụng Linux và tôi tò mò về cách các lệnh được tích hợp sẵn như là cd được xác định.shell được xây dựng trong lệnh trong linux là gì?

Ngoài ra, tôi sẽ đánh giá cao nếu ai đó có thể giải thích cách chúng được triển khai và thực thi.

+1

Điều này không liên quan gì đến hạt nhân. –

Trả lời

12

Nếu bạn muốn xem cách dựng sẵn bash được định nghĩa sau đó bạn chỉ cần phải nhìn vào Section 4 of The Bash Man Page.

Nếu, tuy nhiên, bạn muốn biết bashins bash là được triển khai, bạn cần xem the Bash source code vì các lệnh này được biên dịch thành tệp thực thi bash.

Một cách nhanh chóng và dễ dàng để xem liệu lệnh có là bash dựng sẵn hay không là sử dụng lệnh help. Ví dụ, help cd sẽ chỉ cho bạn cách xây dựng bash của 'cd' được xác định. Tương tự cho help echo.

3

Manjari, Kiểm tra mã nguồn của vỏ bash từ ftp://ftp.gnu.org/gnu/bash/bash-2.05b.tar.gz Bạn sẽ thấy rằng định nghĩa của vỏ built-in lệnh trong không ở trong một thực thi nhị phân riêng biệt nhưng trong phạm vi số nhị phân vỏ thân (vỏ tên built-in đề xuất rõ ràng điều này).

1

Vỏ nội bộ - http://linux.about.com/library/cmd/blcmdl1_builtin.htm ví dụ: -

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

Không phải nội trang hệ vỏ mà là nhị phân.

which ls 
/bin/ls 
+2

Không hoàn toàn đúng - đôi khi nội trang và tệp thi hành trùng lặp, ví dụ: mặc dù có chương trình '/ bin/echo', hầu hết các shell cung cấp nội trang 'echo' riêng của chúng. –

+0

một ví dụ khác là "thời gian" –

11

Bộ cài sẵn thực tế thay đổi từ vỏ thành vỏ. Có:

  • Special built-in utilities, mà phải được xây dựng-in, vì họ có một số tính chất đặc biệt
  • Regular built-in utilities, được hầu như luôn luôn được xây dựng-in, vì hiệu suất hoặc cân nhắc khác
  • Bất kỳ tiện ích tiêu chuẩn cũng có thể được tích hợp nếu trình cài đặt trình bao mong muốn.

Bạn có thể tìm hiểu xem tiện ích có được sử dụng lệnh type, được hỗ trợ bởi hầu hết các trình bao (mặc dù đầu ra của nó không được chuẩn hóa). Một ví dụ từ dash:

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

Re cd tiện ích, về mặt lý thuyết không có gì ngăn cản một người thực hiện shell để thực hiện nó như lệnh bên ngoài. cd không thể thay đổi thư mục hiện tại của trình bao trực tiếp, nhưng, ví dụ, cd có thể liên lạc thư mục mới với quá trình vỏ thông qua một ổ cắm. Nhưng không ai làm như vậy bởi vì không có điểm. Ngoại trừ vỏ rất cũ (nơi không có khái niệm được xây dựng), trong đó cd sử dụng một số hack hệ thống bẩn để thực hiện công việc của mình.

Làm thế nào để cd được triển khai bên trong vỏ? Thuật toán cơ bản được mô tả here. Nó cũng có thể làm một số công việc để hỗ trợ các tính năng bổ sung của shell.

2

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

Các vấn đề liên quan