Tại sao có nhiều shell trong một hệ thống giống như Unix?


16

Tôi mới bắt đầu tìm hiểu các nguyên tắc cơ bản của Unix và tự hỏi tại sao có rất nhiều hệ vỏ trong một hệ thống giống như unix. Từ cuốn sách Lập trình nâng cao trong môi trường Unix :

Shell là trình thông dịch dòng lệnh đọc đầu vào của người dùng và thực thi các lệnh. Đầu vào của người dùng đối với shell thường là từ thiết bị đầu cuối (shell tương tác) hoặc đôi khi từ le (được gọi là kịch bản shell).

Và sau đó cuốn sách tiếp tục liệt kê một số chương trình shell như Bourne shell, Bourne-again shell, Cshell, v.v. Câu hỏi của tôi về cơ bản là tại sao chúng ta cần nhiều vỏ?


4
Lý do tương tự mà có rất nhiều tiêu chuẩn cho các công nghệ khác nhau được áp dụng. xkcd.com/927
Dan Neely

1
Vì lý do tương tự tại sao bạn có thể có trình biên dịch / trình thông dịch cho nhiều ngôn ngữ lập trình (cũng có nhiều trình biên dịch cho một ngôn ngữ) hoặc nhiều trình duyệt internet.
Mischa Arefiev

6
Câu hỏi của bạn là tự phụ. " Tại sao chúng ta cần nhiều vỏ? " Ai nói với bạn rằng chúng ta cần nhiều vỏ? Cuốn sách của bạn cho biết chúng tôi nhiều vỏ. Đó không phải là điều tương tự.
Cướp

Câu trả lời:


15

Hầu hết các shell được sử dụng trong các môi trường UNIX hiện đại đều có nghĩa là phù hợp với đặc tả kỹ thuật POSIX sh. POSIX sh có nguồn gốc từ vỏ Korn ban đầu (ksh88), lần lượt được lấy từ vỏ Bourne trước đó, nhưng POSIX sh chỉ chỉ định một tập hợp con nhỏ của chức năng thậm chí là ksh88. Một shell chỉ thực hiện yêu cầu tối thiểu là thiếu nhiều tính năng cần thiết để viết tất cả trừ các kịch bản tầm thường nhất một cách an toàn và hợp lý. Ví dụ, các biến và mảng cục bộ là các phần mở rộng không chuẩn.

Do đó, lý do đầu tiên là mở rộng vỏ với các tính năng bổ sung. Vỏ khác nhau chọn tập trung vào những thứ khác nhau. Ví dụ, Zsh tập trung vào các tính năng tương tác nâng cao trong khi ksh93 (vỏ korn "gốc" hiện tại) tập trung vào các tính năng và hiệu suất lập trình mạnh mẽ. Ngay cả các shell rất tối thiểu như Dash cũng thêm ít nhất một vài tính năng bổ sung không chuẩn như các biến cục bộ.

Các tính năng bổ sung hiếm khi có khả năng tương tác rộng rãi, nếu có. Hầu hết các tính năng của ksh88 có khả năng tương tác khá tốt, chẳng hạn như cú pháp toàn cầu mở rộng, nhưng với các tính năng không chuẩn, không có gì đảm bảo và bạn phải thực sự biết bạn đang làm gì để sử dụng chúng theo cách di động.

Lý do thứ hai là di sản. Vẫn còn rất nhiều Unix độc quyền ngoài kia sử dụng các triển khai phi tiêu chuẩn cổ đại cho / bin / sh của họ. Cho đến gần đây, Solaris vẫn sử dụng Bourne như là sự thách thức của họ và chọn duy trì lớp vỏ Gia truyền thay vì nâng cấp lên thứ gì đó hiện đại. Các hệ thống này thường đi kèm với các shell khác nhau mà bạn có thể chuyển sang, ví dụ bằng cách thay đổi biến PATH của bạn hoặc thay đổi shebang trong các tập lệnh riêng lẻ.

Vì vậy, để tóm tắt. Có nhiều shell, thường theo mặc định:

  • Đối với các tính năng bổ sung, đặc biệt là để đối phó với các tính năng bổ sung không di động.
  • Để xử lý các tập lệnh kế thừa thường không được xác định.
  • kích thước / hiệu suất. Các hệ thống nhúng thường yêu cầu các shell nhỏ như mksh hoặc busybox sh.
  • Lý do cấp phép. AT & T ksh là phần mềm độc quyền cho đến khoảng năm 2000 hoặc lâu hơn. Điều này phần lớn là những gì đã tạo ra tất cả các bản sao giống như ksh như Zsh và Bash.
  • Những lý do lịch sử khác. Mặc dù ngày nay không phổ biến lắm, nhưng đã có những nỗ lực triệt để trong việc thiết kế lại ngôn ngữ, chẳng hạn như scsh và es. Tính năng thay thế quá trình của nhiều shell ban đầu đến từ RC (với một cú pháp khác nhau một chút) và mở rộng cú đúp từ csh. Các vỏ khác nhau có sự kết hợp khác nhau của các tính năng như vậy có sẵn, thường có một số khác biệt tinh tế hoặc không quá tinh tế.

2
Lưu ý rằng mặc dù localkhông phải là POSIX hoặc Unix, nhưng nó được chỉ định và yêu cầu trong tiêu chuẩn Linux (LSB) và tiêu chuẩn chính sách debian . Lưu ý rằng đó eslà một theo dõi trên rc.
Stéphane Chazelas

1
Những gì bây giờ mkshcó nguồn gốc là Public Domain Bourne Shell, cũng được viết vì lý do cấp phép. (Những vấn đề này vẫn còn - cấp phép và tính di động và kích thước là ba yếu tố giúp tôi thuyết phục Google đưa mksh với Android.)
mirabilos

19

Bởi vì mọi người có những nhu cầu khác nhau và thật tốt khi có những lựa chọn thay thế phù hợp với nhu cầu của bạn trong tình huống nhất định. Một cái vỏ chỉ là một công cụ của riêng nó và theo ý kiến ​​của tôi thì có thể thay thế được. Đó là sức mạnh của Unix / Linux, trái ngược với những gì Microsoft Windows đã chọn.

Tương tự ... Tại sao có quá nhiều trình soạn thảo văn bản? Tại sao mọi người phát triển một trình duyệt mới nếu đã có một trình duyệt? Tại sao lại có Gnome, KDE, Xfce, LXDE, E17, v.v.


12
Đúng. Người ta có thể hỏi "tại sao rất nhiều người quản lý cửa sổ?" cũng. Một người bản địa unix có thể đặt câu hỏi ngược lại: tại sao chỉ có một CMD.EXE? Tại sao Windows quá cứng nhắc và không thể tùy chỉnh?
Bruce Ediger

1
@BruceEdiger Ý bạn là gì, chỉ một cmd.exe? Có những lựa chọn thay thế cho nó, nếu bạn muốn sử dụng chúng. Ngay cả chính Microsoft cũng có PowerShell thay thế.
Malcolm

3
Ngay cả COMMAND.COMtrong DOS cũng có thể thay thế. Tuy nhiên, bạn thường có một hệ thống rất dễ vỡ do các giả định của các ứng dụng khác (và những người dùng khác). Kết quả là, có rất ít lựa chọn thay thế thành công CMD.EXE. Một là PowerShell, có quán tính của Microsoft ủng hộ nó. Một ví dụ khác là, thật kỳ lạ, bashdo sự hỗ trợ tốt từ cộng đồng Cygwin, chưa kể đến những người MinGW. Đối với Trình quản lý cửa sổ, Windows chỉ có một lần, nhưng đã có một vài lần khi môi trường Windows tự phát triển.
RBerteig

+1 cho câu trả lời này. Tôi nghĩ đó là lý do tại sao chúng ta có rất nhiều hương vị UNIX đa dạng khác nhau: AIX, HP-UX, Solaris, Tru64, IRIX, UnixWare, OS X, Linux, FreeBSD, NetBSD, OpenBSD, ..., bạn đặt tên cho nó!
tonga

4

Câu trả lời ngắn

Do một lịch sử cấp phép kỳ lạ, không có thực thể nào phát triển Unix. Đó là một quá trình cộng đồng nơi cả tình nguyện viên và tập đoàn đã tham gia. Những thực thể này không phải lúc nào cũng chia sẻ tất cả các công cụ của họ, vì vậy các vỏ riêng biệt đã xảy ra. Vào thời điểm chúng tôi nhận ra việc này có hiệu quả như thế nào, đã quá muộn để thống nhất tất cả các vỏ được sử dụng. Thay vào đó, công việc đã được thực hiện để đảm bảo rằng tất cả các vỏ này sẽ tương thích (về mặt lý thuyết) với nhau .

Câu trả lời dài là phức tạp và liên kết chặt chẽ với lịch sử của chính Unix. Không có cách nào nó sẽ giữ một câu trả lời duy nhất trên trang này, nhưng nó đã được ghi nhận rộng rãi (mis). Bạn sẽ tìm thấy câu trả lời chi tiết và chính xác hơn bằng cách tìm kiếm trên web và sách liên quan đến lịch sử Unix.


2

Các shell khác nhau tồn tại vì cùng một lý do như các trình duyệt web khác nhau tồn tại: mọi người đều có sở thích và một số shell có hành lý hoặc động lượng lịch sử. Mỗi có tính năng và đặc điểm khác nhau.


1

Hầu hết, lịch sử ...

Bourne được phát triển như một phần của (S sở hữu) SysV Unix, trong khi BSD sử dụng csh... Sau đó, bash được phát triển như một sự thay thế nguồn mở cho shell Bourne (và các phiên bản cải tiến của nó, như ksh). Một lớp vỏ giống như Bourne đã được sử dụng trong tiêu chuẩn POSIX. ksh là tuân thủ và bash có thể được tuân thủ.

Shell thích cshtcshdễ sử dụng tương tác hơn so với shell Bourne ban đầu (thiếu hoàn thành lệnh, v.v.) nhưng thật kinh khủng khi viết kịch bản ...

Trong một số môi trường, chẳng hạn như các hệ thống nhúng dựa trên Unix, các tính năng kịch bản, kích thước và tốc độ quan trọng hơn các tính năng tương tác như hoàn thành lệnh và một biến thể khác nhau của hệ vỏ có xu hướng được sử dụng.

Để tạo tập lệnh di động, bạn nên sử dụng biến thể Bourne tuân thủ POSIX và tránh các phần mở rộng.


3
-1 vì nghĩ rằng thế giới bắt đầu tại SysV. Các Bourne shell được phát hành vào UNIX v7 vào năm 1977, sáu năm trước SysV được phát hành.
Cướp

@ Rob, s / năm 1977 / năm 1979 /
Stéphane Chazelas

Đủ công bằng ... Lịch sử * nix khá phức tạp ... Xem en.wikipedia.org/wiki/File:Unix_history-simple.svg
Gert van den Berg
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.