Sự khác biệt giữa các thuật ngữ của Shell Shell và và Bash Bash Bash là gì?


11

Sự khác biệt giữa "Shell" và "Bash" là gì và những thuật ngữ này có nghĩa là gì?

Theo tôi biết, không có sự khác biệt. Nhưng tôi đã thấy nhiều cuốn sách về "Shell" và những cuốn khác về "Bash"!

Vì vậy, trong trường hợp tôi muốn làm việc với Terminal trên Mac OS X và viết một số tập lệnh bash, tôi tự hỏi tôi nên chọn loại sách nào.


7
Nó là một lớp so với sự phân biệt cá thể.
Kaz

1
Tài liệu đọc thú vị: unix.stackexchange.com/questions/4126/iêu
Bernhard

1
vỏ đầu tiên được viết bởi một chàng trai tên là Bourne. BASH là từ viết tắt của 'Boune Again Shell'. Điều quan trọng là vui chơi!
Kinjal Dixit

Câu trả lời:


31

" Shell " là bất kỳ phần mềm nào cung cấp giao diện cho hệ điều hành. Chẳng hạn, explorer.exe là hệ vỏ mặc định trong Windows (mặc dù có các lựa chọn thay thế ) và trên OS X Finder cung cấp nhiều chức năng tương tự. Trên Linux / * nix, shell có thể là một phần của môi trường máy tính để bàn (như Gnome hoặc KDE ) hoặc có thể là một thành phần phần mềm riêng biệt nằm trên nó (như Unity hoặc Cinnamon ).

Các ví dụ trên là tất cả các vỏ đồ họa sử dụng kết hợp các cửa sổ, menu, biểu tượng và các yếu tố khác để cung cấp giao diện người dùng đồ họa (GUI) có thể được tương tác bằng cách sử dụng con trỏ chuột. Tuy nhiên, trong ngữ cảnh của phần mềm như Bash hoặc viết tập lệnh, "shell" thường được dùng để chỉ một trình thông dịch dòng lệnh, thực hiện phần lớn các nhiệm vụ giống như trình bao đồ họa, ngoại trừ hoàn toàn dựa trên văn bản.

Bash là một ví dụ cụ thể của shell dòng lệnh và có lẽ là một trong những shell được biết đến nhiều nhất, là mặc định trong nhiều bản phân phối Linux cũng như OS X. Nó được thiết kế để thay thế cho shell Bourne (viết tắt của Bash cho "Bourne again shell"), một trong những shell Unix đầu tiên .

Ví dụ về các dòng lệnh trên Windows bao gồm cmd.exe (còn gọi là Dấu nhắc lệnh) và PowerShell .


3
Finder thường không được gọi là shell trên OS X. Hầu hết các tính năng quản lý GUI và cửa sổ được xử lý bởi các quy trình khác.
Lri

1
@LauriRanta Wikipedia dường như không đồng ý . Bất kể nó có trợ giúp từ các quy trình khác hay không, công việc của nó là cho phép người dùng tương tác với HĐH cơ bản thông qua GUI và do đó, nó phù hợp với mô tả của trình bao đồ họa.
Indrek

1
Tôi đoán thuật ngữ shell đồ họa cũng có thể áp dụng cho các ứng dụng quản lý tập tin. Nhưng nó thường không được sử dụng trên OS X và Finder giống Nautilus hơn là Windows shell hoặc Unity.
Lri

6
@LauriRanta: câu đố nhanh, biểu tượng của Nautilus là gì?
Lie Ryan

2
@LauriRanta Sẽ không là ứng cử viên sáng giá hơn cho vỏ? Khởi chạy các chương trình và mở tài liệu, Expose / Spaces / Mission Control, AFAIK Launchpad và trình chuyển đổi tác vụ cũng là tất cả các tính năng của Dock.
Daniel Beck

13

Bash là một trong nhiều vỏ.

Một shell trên một hệ thống giống như Unix hoặc Unix như OSX hoặc Linux là một chương trình ứng dụng cung cấp giao diện dòng lệnh cho hệ điều hành, cho phép bạn nhập lệnh và chạy chúng. Có một số shell khác nhau để lựa chọn nhưng tất cả chúng đều cung cấp ký tự đại diện tên tệp, đường ống, tài liệu ở đây, thay thế lệnh, biến và cấu trúc điều khiển để kiểm tra điều kiện và lặp.

Shell Unix ban đầu là shell Bourne , sh, được viết bởi Stephen Bourne tại Bell Labs. Sau đó đến vỏ C , được viết bởi Bill Joy tại Berkeley, kể từ khi được cập nhật là tcsh . Các shell khác bao gồm shell Korn , ksh, được viết bởi David Korn, cũng tại Bell Labs, và bash , "Bourne again shell", được viết bởi Brian Fox cho dự án GNU như một sự thay thế miễn phí cho sh.

Ngày nay, bash có lẽ là shell Unix phổ biến nhất nhưng rất nhiều người (bao gồm cả tôi) vẫn thích shell C dựa trên (với một số người trong chúng ta có vẻ như thế) cú pháp đẹp hơn của nó. Về cơ bản, đó là vấn đề của hương vị, vì vậy tôi khuyên bạn nên đọc các bài viết trên Wikipedia mà tôi đã liên kết để giúp bạn bắt đầu.


2
Shell không nhất thiết phải dựa trên dòng lệnh, cũng có nhiều shell đồ họa, ví dụ Nautilus, Windows Explorer, Finder, v.v. Điểm quan trọng của shell là nó là trình bao / giao diện người dùng / shell xung quanh các chức năng / hệ thống hệ điều hành lõi, tức là shell cung cấp quản lý tài nguyên (ví dụ: quản lý tệp) và quản lý các quy trình.
Lie Ryan

1
@LieRyan không phải là trình bao, chúng là trình quản lý tệp. Shell cho phép các trình thông dịch lệnh / script tích hợp chạy trong chúng. Xem câu trả lời của tôi. Chỉ có thể chạy một chương trình từ trình quản lý tệp sẽ không biến nó thành một trình bao.
Bill Rosmus

@BillR: Bạn nên thông báo cho các anh chàng Gnome Shell về định nghĩa của bạn.
paradroid

2
Tôi có khuynh hướng đồng ý với Lie Ryan và paradroid, rằng các shell đồ họa hiện được coi là các shell. Tôi được đầu tư vào mô hình dòng lệnh như bất kỳ ai và chống lại việc chấp nhận các vỏ đồ họa như đạn pháo trong suốt thập niên 90. Nhưng với tất cả các widget bảng điều khiển và không có gì trong một vỏ đồ họa hiện đại, giờ đây tôi đồng ý cách sử dụng phổ biến là gọi chúng là shell và cách sử dụng đó là chính xác. Chúng khớp với định nghĩa của shell, lớp giao diện người dùng tương đối mỏng xung quanh HĐH cơ bản. Các vỏ đồ họa yếu hơn về cách mọi người sẽ viết kịch bản bất cứ điều gì nhưng nhiều người dùng không quan tâm đến điều đó.
Nicole Hamilton

6

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.


2

Shell là một giao diện người dùng dựa trên văn bản.

Bash là một loại vỏ.


2
"Giao diện người dùng dựa trên thử nghiệm" là gì? Ngoài ra, sẽ rất tốt nếu bạn mở rộng câu trả lời của mình một chút .. Như bạn có thể thấy từ các câu trả lời khác, nó luôn giúp đưa ra nhiều ngữ cảnh hơn.
slhck

Lấy làm tiếc. Giao diện người dùng dựa trên văn bản. Làm thế nào bạn muốn cho tôi giải thích về điều đó? Một shell là cách dòng lệnh của bạn tương tác với kernel hệ điều hành. Shell diễn giải các lệnh của bạn và chuyển tiếp chúng vào máy, sau đó, lần lượt, thực hiện các hoạt động cần thiết liên quan đến lệnh bạn đã đưa ra? Nếu không có sách hướng dẫn 500 trang, thật khó để giải thích hiệu quả câu hỏi mơ hồ này. Nỗ lực của câu trả lời phù hợp với nỗ lực của câu hỏi. Câu hỏi này là táo để cam.
HayekSplosives

Nếu bạn nghĩ rằng một câu hỏi cho thấy nỗ lực bây giờ không tự động có nghĩa là bạn không nên đặt nỗ lực vào câu trả lời cho nó. Câu trả lời của bạn, so với những người khác, thiếu một chút chi tiết. Tất nhiên tùy thuộc vào bạn để thêm điều đó.
slhck

Tôi đánh giá cao sự điều chỉnh và bài học về trách nhiệm cá nhân. Cảm ơn bạn đã bảo vệ những người không sẵn sàng nỗ lực từ những người làm. Tôi hoàn toàn không thể quên được mình đã nợ bao nhiêu poster.
HayekSplosives


1

bash là một trong nhiều vỏ tồn tại.

Tất cả các vỏ có điểm tương đồng và khác biệt của chúng. Ví dụ: tập lệnh được viết bằng bash, có thể tương thích hoàn toàn hoặc phần lớn với trình bao khác (ví dụ zsh ).

Do thực tế bashlà rất phổ biến, người ta thường ngụ ý rằng một kịch bản tương thích với nó.

Nếu bạn đang tìm mua một cuốn sách, hãy mua một cuốn được viết riêng cho vỏ bạn định sử dụng. Nó sẽ là một ý tưởng tốt để đọc về sự khác biệt của họ trước khi chi tiền.

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.