Shell và các ứng dụng


7

Có đúng là tất cả các lệnh có thể chạy trong bash không thực sự là một phần của bash? Tôi dần nhận ra rằng tôi đã nhầm lẫn trình bao và các ứng dụng có thể chạy trong nó.


3
Câu hỏi không rõ ràng. Nếu allcác lệnh không phải là một phần của bash, thì không có rest.
người dùng không xác định

@user: Phần còn lại là những lệnh không phải là lệnh. Chẳng hạn như đường ống, và chuyển hướng.
Tim

Phần còn lại của những gì? Từ khóa? Bạn nghĩ rằng, chuyển hướng không phải là một phần của bash? Lệnh không? Tất cả mọi thứ, không phải là một chương trình bên ngoài trong đường dẫn là một phần của bash. Còn gì nữa không
người dùng không xác định

Tôi nói phần còn lại là một phần của bash. Phần còn lại cũng bao gồm "cho", các biến, biểu thức, ...
Tim

Câu trả lời:


23

Không có đường viền sắc nét giữa vỏ và các ứng dụng.

Một số lệnh mà bạn chạy trong shell phải được tích hợp vào shell, vì chúng hoạt động trên tiến trình shell. Ví dụ, cdthay đổi thư mục làm việc của shell và điều này không thể được thực hiện từ bên ngoài, do đó cdphải là một lệnh tích hợp. Nhưng đây là một chi tiết thực hiện. Một người dùng bình thường không cần biết rằng có những lý do kỹ thuật bắt buộc cdphải là một lệnh tích hợp.

Ở một thái cực khác, có những ứng dụng lớn được tạo ra bởi các tác giả khác nhau, chẳng hạn như Firefox hoặc Emacs. Chúng sẽ không được tích hợp vào bất kỳ vỏ nào vì chúng quá lớn. Nhưng đây không phải là một điều không thể cơ bản, chỉ là vấn đề thiết kế. Ví dụ, có các shell¹ có tích hợp để tạo các ứng dụng GUI đơn giản.

Ở giữa, có những lệnh có thể đi cả hai chiều. Ví dụ, echolệnh không cần phải được xây dựng trong shell, nhưng hầu như mọi shell đều được tích hợp bởi vì nó rất nhỏ và được sử dụng thường xuyên nên rất hiệu quả. Một ví dụ khác kill, đối với việc sử dụng thông thường có thể là một lệnh bên ngoài, nhưng việc tích hợp sẵn có một số lợi thế: bạn có thể gọi nó ngay cả khi bạn đã đạt đến giới hạn về số lượng quy trình và bạn có thể giao cho nó một công việc shell số ( kill %2) thay cho ID tiến trình. Ngay cả về mặt [ … ]cấu trúc (cũng có thể được viết test), về nguyên tắc, có thể là một lệnh bên ngoài, nhưng được xây dựng thành các shell vì lý do tương tự như echo.

Nếu bạn tò mò, bạn có thể kiểm tra trạng thái của một lệnh đã cho bằng typelệnh. Ví dụ: trong thiết lập của tôi:

% type while type setenv cp emacs
while is a reserved word
type is a shell builtin
setenv is a shell function
cp is an alias for cp -i
emacs is /usr/bin/emacs

Các từ dành riêng như whilethenlà một phần của cú pháp shell. Nội dung là các lệnh được tích hợp vào trình bao và không yêu cầu thực thi bên ngoài. Hàm là các lệnh ghép được xác định và đặt tên bởi người dùng và có thể được gọi bằng tên của họ. Bí danh là tên ngắn do người dùng định nghĩa cho các lệnh dài hơn (hành xử khác với các hàm). Ví dụ cuối cùng là một lệnh bên ngoài.

¹ dtksh . Không có thực hiện miễn phí.


1
Bạn sẽ nhận thấy rằng /bin/[tồn tại và là một liên kết cứng /bin/testtrên hầu hết các hộp (tất cả?) * Nix. Nó không phải là một bản dựng sẵn cho vỏ Bourne cổ điển. Ngoài ra còn có những động vật khó hiểu như busyboxthực hiện hầu hết các lệnh cốt lõi và vỏ, quyết định chúng đang ở thời điểm nào bằng cách kiểm tra tên được sử dụng để gọi chúng.
RBerteig

Đối với các lệnh giống như echocả hai dựng sẵn và bên ngoài, sử dụng type -ađể hiển thị cả hai (theo thứ tự ưu tiên).
Philomath

8

Hãy thử sử dụng lệnh bash type. typemô tả lệnh là gì: nếu đó là một shell dựng sẵn, nếu đó là bí danh, nếu đó là một chương trình khác ...

Thí dụ:

[braga@coleman ~]$ type echo
echo is a shell builtin
[braga@coleman ~]$ type ls
ls is aliased to `ls --color=auto'
[braga@coleman ~]$ type usermod
usermod is /usr/sbin/usermod

Một số được dựng sẵn, một số thì không. Sử dụng typenếu bạn muốn truy vấn về một lệnh cụ thể. Tham khảo bashtài liệu cho một danh sách tất cả các nội dung.

  • Nội dung là gì?

Các lệnh dựng sẵn được chứa trong chính shell. Khi tên của lệnh dựng sẵn được sử dụng làm từ đầu tiên của lệnh đơn giản, shell sẽ thực thi lệnh trực tiếp mà không cần gọi chương trình khác.

  • Bí danh là gì?

Bí danh cho phép một chuỗi được thay thế cho một từ khi nó được sử dụng làm từ đầu tiên của một lệnh đơn giản. Shell duy trì một danh sách các bí danh có thể được thiết lập và bỏ đặt với các lệnh dựng sẵn bí danh và unalias.

Cả hai trích dẫn đến từ bash mannual .


Cảm ơn! Theo nội dung, chúng có phải là các ứng dụng đi kèm với bash không? Họ có tính năng vỏ của bash? Thế còn bí danh thì sao?
Tim

@Tim Tôi đã mở rộng câu trả lời để bao gồm các định nghĩa cho bí danh và nội dung.
Vitor Py

Lưu ý rằng nhiều nội dung cũng có sẵn dưới dạng các lệnh bên ngoài, có thể trong /usr/binhoặc /bin. Điều này phần lớn là vì lý do lịch sử; shell Bourne cổ điển có số lượng tích hợp ít hơn nhiều so với bash.
RBerteig

0
  • Hầu hết các lệnh không phải là một phần của vỏ. (Shell chỉ chạy nhị phân theo tên đó.)
  • Shell thực hiện cd và đó là từ khóa ngôn ngữ kịch bản (trong khi, cho, v.v.)
  • Các lệnh như echotest có thể hoặc không thể được thực hiện trong shell.
Khi sử dụng trang web của chúng tôi, bạn xác nhận rằng bạn đã đọc và hiểu Chính sách cookieChính sách bảo mật của chúng tôi.
Licensed under cc by-sa 3.0 with attribution required.