Thuật ngữ 'vỏ' được đặt tên tốt. Nó thực sự là một lớp vỏ bao quanh O / S cho phép người dùng tương tác với máy tính. Khi nó được hình thành ban đầu, có rất ít nếu có bất kỳ giao diện người dùng đồ họa nào (không có cửa sổ :(). Mọi thứ đã được thực hiện trên dòng lệnh. Nhưng ngay cả dòng lệnh cũng cần một nơi để sống. Nó vẫn sống và trong vỏ. .
Nói một cách đơn giản, để dòng lệnh trở nên hữu ích, nó cần các hướng dẫn mà nó có thể gọi. Vì vậy, các chương trình đã được thực hiện để chạy bên trong shell cho dòng lệnh sử dụng. Các chương trình được nhóm chặt chẽ trong các gói riêng của họ và dự định làm việc cùng nhau. Chúng bao gồm các chương trình như "ls" và "grep", "ps", "sed", v.v. Chúng cũng bao gồm các lệnh chuyển hướng tệp như ">" và "<" và ống ("|"). Quan trọng hơn, chúng cũng bao gồm các cấu trúc lập trình như các hoạt động có điều kiện (nếu, sau đó, khác, cho các vòng lặp, trong khi các vòng lặp, các cách để kiểm tra trạng thái được trả về khi bạn chạy một câu lệnh (ví dụ: nếu bạn chạy "ls" thì nó có tìm thấy gì không?) như thế). Đây là nền tảng của các tập lệnh (shell) phức tạp hơn,
Khi ai đó sử dụng thuật ngữ 'Bash Shell', họ đang nói về một trình thông dịch dòng lệnh gọi là 'Bash' chạy trong trình bao O / S. Bạn có thể nghĩ nó là viết tắt của 'Bash Shell Interpreter'. Có những người phiên dịch khác như Bourne (Bash là một 'Bourne Shell mới và được cải tiến và nó là viết tắt của Bourne Again Shell). Ngoài ra còn có C-Shell, K-Shell (được ưa chuộng bởi nhiều người viết các tập lệnh shell phức tạp) và các biến thể GNU khác. Trong những năm qua, nó đã trở thành thông lệ khi đề cập đến trình thông dịch dòng lệnh cụ thể mà bạn đang sử dụng làm trình bao vì không thể sử dụng cái này mà không có cái khác. Nhưng thực tế là chúng khác nhau.
Về lý do tại sao chúng được gọi đúng là trình thông dịch dòng lệnh chứ không phải là trình bao thực tế: đó là vì chúng sống trong trình bao và diễn giải tất cả các lệnh như thể chúng đang chạy trong một chương trình. Và shell không quan tâm bạn thông dịch gì trong đó, miễn là nó đáp ứng các tiêu chuẩn chính xác.
Và về lý do tại sao họ được gọi là thông dịch viên, đó là bởi vì họ thực sự là thông dịch viên. Ngay cả khi bạn không chạy một cách rõ ràng một tập lệnh (và tập lệnh thực sự chỉ là một tệp văn bản của các lệnh bạn tạo để bạn có thể thực hiện các lệnh tương tự lặp đi lặp lại mà không cần phải nhập lại chúng). Ví dụ: lấy lệnh 'ls' khiêm tốn. Khi bạn chạy nó, nó sẽ trả về một danh sách các tập tin. Nhưng làm thế nào nó chạy là quan trọng hơn đối với câu hỏi của bạn: Nó thực sự chạy bên trong ngữ cảnh của trình thông dịch dòng lệnh, ngay cả khi bạn chỉ chạy những gì có vẻ là một lệnh tắt đơn giản. Đó là, nó chạy như thể nó là một tuyên bố trong một chương trình lớn hơn. Nó chạy như thể nó nằm trong tệp script script shell mà không thực sự nằm trong tệp script shell. Một tập tin shell shell ẩn danh như nó là.
Bất cứ điều gì bạn chạy trên dòng lệnh đều có điểm chung này (cho dù đó là một lệnh đơn lẻ như 'ls' hoặc tệp tập lệnh chứa đầy đủ các lệnh và trình lặp và câu lệnh điều kiện): tất cả đều được xử lý bởi trình thông dịch dòng lệnh; có thể là Bash, C-Shell, K-Shell (mặc định trên AIX btw).
Để xem ý tôi là gì, hãy tạo một thư mục 'test':
mkdir test
Nhập nó và chạy các lệnh folowing
grep hello *
Bạn sẽ nhận được một số phản hồi như 'không có tệp hoặc thư mục như vậy'. Bây giờ nhập lệnh
echo $?
($? nói, cho tôi biết những gì bạn tìm thấy trong máy tính điện tử nói.) Bạn sẽ thấy nó trả về một số (nó phải là) '2'. Đó là mã trả về từ grep có nghĩa là 'không có tệp hoặc thư mục như vậy'. Bây giờ chạy như sau:
echo hello > hello.txt
grep hello *
echo $?
Bạn sẽ thấy tệp 'hello.txt' được trả về từ lệnh grep ban đầu và bây giờ sẽ thấy 'echo $?' trả về số '0' có nghĩa là nó thực sự tìm thấy thứ gì đó.
Ngay cả khi các lệnh dường như tắt này được chạy, trình thông dịch dòng lệnh hoạt động giống như chúng là một phần của chương trình lớn hơn và theo dõi các giá trị trả về của chúng. Đó là lý do tại sao nếu bạn quên dấu * ở cuối lệnh grep thì nó không trả về. Nó được biết rằng tuyên bố là không đầy đủ và mong đợi nhiều đầu vào. Sau tất cả, bạn có thể hình dung sẽ yêu cầu nó grep kết quả của một số vòng lặp hoàn toàn hợp pháp để viết và chạy trên dòng lệnh.
Dòng dưới cùng là shell là shell và trình thông dịch (bất kể tên của cái bạn sử dụng, 'Bash', k-shell, v.v.) đều khác nhau. Nhưng thường thì chúng được sử dụng thay thế cho nhau, bởi vì tại bất kỳ thời điểm nào, chúng hoàn toàn gắn liền với nhau.