Tại sao Bash ở khắp mọi nơi (trong hầu hết nếu không phải tất cả các bản phân phối Linux)?


50

Bash được sử dụng theo mặc định trong mọi bản phân phối Linux mà tôi đã thử, qua các lựa chọn thay thế như Z shell (zsh). Có một lý do kỹ thuật hoặc lịch sử cho việc này?


1
Không phải vậy. Trên hệ thống FreeBSD của tôi tcsh là shell mặc định!

54
Hệ thống FreeBSD của bạn không phải là bản phân phối Linux.

8
Chúa cấm có sự nhất quán giữa các bản phát hành ...
OMG Ponies

4
Không, nhưng nó thuộc về "mọi nơi" :)

Câu trả lời:


106

Lịch sử (có được không phải thông qua nghiên cứu mà qua việc dành quá nhiều thời gian đi chơi với người của Bell Labs):

  1. Ban đầu (nếu bạn coi khởi đầu là Unix Phiên bản 7) là trình bao Bourne. Steve Bourne là người đầu tiên cho thấy lớp vỏ kiểm soát sự tương tác của người dùng có thể là một chương trình người dùng và không phải là một phần đặc biệt của hệ điều hành. Một bước đột phá lịch sử. Bản thân shell tương đối sạch để tạo kịch bản, nhưng không có chỉnh sửa dòng lệnh hoặc kiểm soát công việc. Giới thiệu của Bourne về Unix Shell vẫn hữu ích cho người dùng mới bắt đầu ngày hôm nay.

    Chỉnh sửa : Tôi đã bỏ qua một số "tiền sử" từ Ken Thompson và John Mashey, cũng từ Multics. Tôi chắc chắn rằng Bourne đã nhận thức được tất cả công việc này (anh ta ở cùng phòng thí nghiệm, 1127, tại Bell Labs), nhưng vỏ của Bourne rất dứt khoát, và công việc trước đó ít có ảnh hưởng trừ khi được giải thích bởi Steve Bourne. Ví dụ, mặc dù sau đó Ken đã viết trình biên dịch Plan 9 C và có ảnh hưởng rất lớn đến Plan 9, nhưng bài viết của Tom Duff về vỏ Plan 9 (RC) chỉ đề cập đến vỏ của Bourne, chứ không phải của Thompson.

  2. Shell chỉ là một chương trình người dùng, vì vậy bất cứ ai cũng có thể viết một. Khi phiên bản 7 Unix được tạo ra ở New Jersey, Berkeley Unix đã được tạo ở California. Bill Joy tại Berkeley đã viết csh, vỏ C. Joy đã thêm kiểm soát công việc và lịch sử, và sau đó chỉnh sửa dòng lệnh, nhưng không nhận thức được công việc của Bourne và do đó, ngôn ngữ của anh ta dựa trên vỏ của Thompson (mà tôi coi là "thời tiền sử" trong viên đạn trước). Cộng đồng Unix yêu thích kiểm soát công việc, nhưng họ cũng yêu ngôn ngữ của Bourne. Đối với một cuộc bút chiến không đặc biệt tốt đối với ngôn ngữ csh, hãy xem Lập trình Csh được coi là có hại . Trong một thời gian, nhiều người đã sử dụng cshtương tác cho các tính năng lịch sử và kiểm soát công việc của mình, nhưng đã sử dụng Bourne shđể viết kịch bản. Tình huống này là ít hơn lý tưởng.

    Chỉnh sửa : Cảm ơn DigitalRoss đã giúp tôi hiểu rõ về niên đại của csh. Vì tôi nhận được sự giáo dục của mình từ những người gọi BSD là "dị giáo Berkeley", nên tôi khá thiếu sự thật ở đó.

  3. Dave Korn tại Bell Labs đã thực hiện một kỹ thuật tái tạo tuyệt vời cho vỏ Bourne để sản xuất vỏ Korn (ksh). Nó hoàn toàn tương thích ngược với vỏ Bourne shnhưng cung cấp một lượng lớn các cải tiến vô giá. kshtrở thành nền tảng của tiêu chuẩn POSIX và được xuất xưởng với phần mềm Sun. (Điều này mặc dù thực tế là Bill Joy rời Berkeley để giúp Sun tìm thấy và là một trong những kẻ phần mềm hàng đầu của họ.)

  4. Bell Labs và AT & T ngu ngốc thất bại trong việc tạo kshnguồn mở. ksh88được sử dụng rộng rãi, nhưng có nguồn là không hợp pháp. Một số người trở nên nghiện đến mức họ trở thành tội phạm kỹ thuật số.

    Chỉnh sửa : Điều này thực sự rất ngu ngốc? Khó biết. Berkeley đã cho Unix đi và các tập đoàn khác sẽ sớm làm theo, nhưng đây vẫn là thời đại mà các Master Corporate tin vào việc tính phí cho Unix. Nhưng kết quả: AT & T Unix đã chết, sau khi được bán cho nhiều bên khác nhau nhiều lần. BSD và các công cụ phái sinh của nó vẫn còn sống và tốt, nhưng những thứ mới nổi này được gọi là "Linux" và "GNU" có một phần rất lớn về tư duy từng thuộc về Bell Labs.

  5. Tổ chức phần mềm miễn phí thực hiện "phòng sạch", từ việc triển khai vỏ POSIX, lấy tất cả các ý tưởng của Dave Korn như hiện tại, cộng với phong cách FSF thông thường bổ sung các tính năng mới của riêng họ, như hoàn thành lập trình. Họ gọi nó là vỏ "Bourne lần nữa", hay bash.

  6. Vào giữa những năm 1990 ksh93, nguồn mở của AT & T , nhưng sau đó thì đã quá muộn để áp dụng rộng rãi. Thỏa thuận cấp phép là phi tiêu chuẩn kỳ lạ. bashkshphân kỳ, và kshkhông bao giờ đạt được thị phần tương xứng với vị trí của nó trong lịch sử.

Những bài học:

  • Sản phẩm đầy đủ đầu tiên để chiến thắng thị trường (sh).

  • Mọi người yêu thích các tính năng mới (kiểm soát công việc, hoàn thành lệnh), nhưng họ thậm chí còn yêu thích chúng hơn khi các kịch bản cũ của chúng tiếp tục hoạt động.

  • Chỉnh sửa : Giáo sư kỹ thuật nên để lại lịch sử cho các nhà sử học khoa học :-)


Tôi nghĩ rằng bạn thực sự có lời giải thích đầy đủ và chính xác nhất cho sự phổ biến của bash so với mọi thứ khác. Tôi đã thấy các môi trường mặc định là zsh và tôi ghét chúng vì tất cả cú pháp chỉ là một chút và tôi không thể tìm ra nó hoặc tôi mắc lỗi.

Bullet (1) cần hiệu chỉnh: trước vỏ Bourne là vỏ Mashey và trước vỏ Mashey là vỏ ur-Shell, vỏ Ken Thompson. Xem en.wikipedia.org/wiki/Unix_shell
Jim Ferrans

2
Không đổ lỗi cho Norman cụ thể, có rất nhiều điểm không chính xác ở đây. Ken Thompson đã viết lớp vỏ đầu tiên, đó là lớp vỏ duy nhất thông qua động cơ V6 và được sử dụng song song trong V7 và 32V. Stephen Bourne không phải là nhà văn vỏ "đầu tiên", ông viết lại vỏ KT. Csh không có kiểm soát công việc cho đến 4.1BSD, mặc dù đó là vỏ đầu tiên để có được nó. Csh không thay đổi bất kỳ cú pháp shell nào, nó tương thích ngược với shell V6, cũng như shell Bourne. Hầu như tất cả các mã đã được cấp phép trong những ngày đó. Chính xác thì điều gì là ngu ngốc về việc tính phí giấy phép cho Unix?
DigitalRoss

2
Có lẽ tôi không giải thích điều này rất tốt, hãy để tôi thử lại. Csh có trước Bourne , hoặc muộn nhất là một triển khai song song cách xa một lục địa. (Trước khi có internet, điều đó rất quan trọng.) Tôi đã ngồi cạnh Bill Joy trong Cory Hall, thỉnh thoảng, khi anh ấy viết nó; Tôi hoàn toàn có thể đảm bảo với bạn rằng ông đã viết nó trên động cơ V6. Như tôi đã nói, csh (và Bourne) tương thích ngược với động cơ V6-Thompson, vì đó là tất cả những gì tồn tại khi họ viết chúng. Tất nhiên, nó không tương thích với Bourne, tài năng của AFAIK Bill Joy không bao gồm việc nhìn thấy tương lai
DigitalRoss

1
Không bashcó ý tưởng hoàn thành lập trình từ tcshđâu?

46

Bash có hai điều hoàn toàn khác nhau dành cho nó.

  1. Đó là một cái vỏ tốt. Đây là một trong 2 shell (cái còn lại là zsh) tích hợp một số cshtính năng thú vị như !thay thế lịch sử vào cú pháp posix. Nó có rất nhiều phần mở rộng, bao gồm cả mảng.

  2. Nó là vỏ FSF / GNU. Trong thế giới nguồn mở, điều này mang lại cho nó một loại bộ đệm.

Tôi cũng nên thêm rằng nó không phải luôn luôn là mặc định. ashthường được sử dụng như / bin / sh để trong khi bashcó thể là shell tương tác, ashlà shell "chỉ chạy tệp lệnh". Điều này là do ashnhỏ hơn và nhanh hơn và chứa các tính năng posix, vì vậy đây là một tập hợp con thích hợp. Sử dụng ashnhư một vỏ tương tác đôi khi có vấn đề. Trên NetBSD, nó hoạt động tốt, bởi vì nó được xây dựng với tất cả các tính năng. Đó là một loại vỏ của chúng trong khi đó bashlà một gói bên ngoài. Nhưng trên Linux ashthường được coi là không tương tác, vì vậy họ biên dịch nó mà không có lịch sử và không có chỉnh sửa dòng (quan trọng) trên lý thuyết rằng nó chỉ được sử dụng để chạy các gnu configuretập lệnh khổng lồ đó .

Câu chuyện về hai cái vỏ

Lịch sử thực sự của vỏ

CẬP NHẬT: Có một lịch sử không chính xác của trình bao được sao chép từ nơi này sang nơi khác trên web và mọi người có thể tin được điều đó một cách dễ hiểu. Tôi sẽ cố gắng đưa ra một phiên bản chính xác và cung cấp một vài liên kết để chứng minh nó ở đây.

  1. Lớp vỏ đầu tiên chắc chắn không phải là vỏ Bourne mà do chính Ken Thompson viết và phân phối bằng động cơ V6, đây là phiên bản mà AT & T gửi đến các trường đại học và phòng thí nghiệm của chính phủ. Đây là những gì đưa Unix lên bản đồ. Nó có tất cả các điều cơ bản, <, >, >>, |, &nhưng nó chỉ có gotocú pháp điều khiển đơn giản thông qua một chương trình bên ngoài tìm kiếm trên đầu vào tiêu chuẩn. Không có kịch bản shell phức tạp sau đó. Các shell sau này sẽ mở đầu vào lệnh trên một fd riêng. Nó có thể trông đơn giản ngày nay nhưng trong bộ phim kinh dị điện toán năm 1970, đó là điều tốt nhất trên trái đất. Dù bạn có tin hay không, chiếc vỏ cổ xưa này có luồng twitter riêng ngày hôm nay và dĩ nhiên là một trang chủ .
  2. Vỏ thứ hai csh, được viết (như đã vi) bởi Bill Joy tại UCB. Đây là trước khi đường đọc GNU và đường biên tập NetBSD, do đó, nó có vẻ hoàn toàn hợp lý để làm lịch sử với !cú pháp. Csh đã thêm hầu hết các tính năng shell ngày nay nhưng với cú pháp csh. Csh đã không thay đổi bất kỳ cú pháp , vô cớ hay cách khác. Nó thực sự tương thích ngược với shell của Thompson và ban đầu bao gồm mã nguồn TS.
  3. Shell thứ ba là shell Bourne, với cú pháp khác nhau. Unix đã được phát triển song song tại UCB và AT & T. Shell này có bộ cấp phát bộ nhớ kỳ lạ (tôi nghĩ rằng nó chỉ sử dụng nhiều bộ nhớ hơn, SIGSEGV bị mắc kẹt, đã tạo ra một brk mới (2) và sau đó thử lại) khiến nó khó chạy trên các cổng Unix mới, vì vậy oshcshvẫn phổ biến trong một thời gian . Không có internet và nó đã được cấp phép SW, vì vậy trong môi trường đó, có thể Stephen Bourne không biết về vỏ của Joy và chắc chắn Joy không biết về Bourne. Có thể hai vỏ lần đầu tiên gặp nhau khi UCB có VAX và phát hành trước Unix / 32V đã bị lãng quên . Tôi nhớ Bill phàn nàn về việc phân bổ bộ nhớ. Lưu ý rằng cả hai vỏ đều tương thích ngược với vỏ V6, họ chỉ đơn giản là mở rộng cú pháp theo các hướng khác nhau.
  4. Bây giờ thực sự có nhiều shell không tương thích, mà AT & T đã thêm tương thích Bourne ksh. Cuối cùng, cshđã có mã nguồn bán sẵn, nhưng nó đã bị ràng buộc trong một vụ kiện giữa AT & T và Đại học California . Tuy nhiên, đây là thời kỳ huy hoàng của BSD Unix khi các công ty tinh vi có thể chi trả khoản phí 50.000 đô la sẽ mua giấy phép AT & T nhưng cài đặt các bản phân phối BSD 4.x và các trường đại học đã nhận được nó miễn phí.
  5. Trong tình huống này với nhiều vấn đề pháp lý và kỹ thuật, nhiều triển khai độc lập đã được thực hiện. Ít nhất là nhiều người đã đi với cshcú pháp như đã đi với cú pháp shell Bourne, và một số đã hợp nhất cả hai. Bạn đã có ít nhất tcsh, zsh, bash, và ash. Cú pháp Bourne là "chính thức", là một phần của các bản phát hành AT & T, nhưng vào thời đó, BSD khá quan trọng và Sun, ban đầu là BSD, đã phân phối một lượng lớn Unix SW mà thế giới gặp phải.
  6. Một phần vì vụ kiện USL, FSF và Linux có một lĩnh vực mở. Trong khi đó, AT & T đã xoay sở để chiến đấu với một trong số ít các thực thể trên trái đất lớn hơn họ (Bang California) và cuối cùng họ đã không thắng kiện, và cuối cùng, việc phân phối BSD là hợp pháp bước chân. Nhưng sau đó Linux và bash đã có mặt ở khắp mọi nơi, và vì vậy ngày nay BSD là một phân khúc thích hợp.
  7. Cuối cùng, bash là một vỏ tốt (mặc dù rõ ràng bị từ chối riêng tư bởi tác giả ban đầu của nó) và nó hoàn toàn xứng đáng với sự thành công của chính nó. csh sẽ bị lu mờ bởi tcsh và zsh ngay cả khi tro, bash và ksh không thắng cuộc chiến cú pháp.

Ngoài ra, / bin / sh cần được liên kết tĩnh.

Nếu bất cứ điều gì trong /bin/sbinphụ thuộc vào /usr, đó là hỏng và cần phải được sửa chữa; họ chỉ nên phụ thuộc vào các thư viện trong /lib. Chỉ logincần PAM; "API mới hơn" yêu cầu lib động sẽ là NSS. "Xu hướng"? NetBSD 2.0 đã chuyển sang hoàn toàn năng động /bin/sbin5 năm trước, FreeBSD 5.2 thậm chí còn lâu hơn và Linux ... tốt, điều đó thay đổi theo bản phân phối, nhưng đó cũng là một thời gian dài.
ephemient

2
Tôi muốn làm rõ rằng câu trả lời của tôi là tác phẩm gốc của tôi; không có từ nào được sao chép từ bất cứ đâu.
Norman Ramsey

1
Chắc chắn, tôi không có nghĩa là bạn đã dán nó, chỉ là có rất nhiều thông tin sai lệch xung quanh và tôi không muốn làm phiền bạn vì đã báo cáo một câu chuyện đã bị hiểu lầm.
DigitalRoss

6

Để thêm vào những gì @DigitalRoss nói

  • Bash là một sự thay thế hoàn toàn cho supix-sh, thậm chí đến mức nếu được gọi là / bin / sh sẽ mô phỏng hoàn toàn posix-sh. Posix-sh là "tiêu chuẩn" cho các hệ thống unix thương mại như một vỏ mẫu số chung. Vì vậy, một cái gì đó bắt đầu từ đó và xây dựng trên nó đang bắt đầu với rất nhiều.

4

Bởi vì Linux chỉ là Kernel (và các công cụ hỗ trợ cần thiết) trong khi GNU cung cấp (hoặc đã cung cấp) tất cả các bản sao phần mềm Unix cơ bản làm cho cái mà chúng ta gọi là "Linux" có thể sử dụng được. Bash là shell của dự án GNU được viết dưới dạng bản sao của shell Bourne cũ hơn (sh) từ Phiên bản Unix 7.


anh ấy không hỏi "tại sao lại có một chương trình shell"
Hasen

@hasen j: Câu hỏi được đặt ra nếu có một lý do lịch sử tại sao tất cả các hệ thống Linux mà anh ta đã sử dụng mặc định cho Bash làm vỏ.
beggs

2
@hasen j: những người ăn xin không trả lời "tại sao lại có chương trình shell". Bạn đã bỏ lỡ điểm của câu trả lời, vì rõ ràng có tất cả các trò chơi hạ gục đầu gối SO khác.

1

Theo khảo sát của unix.com, nó không xa hơn nhiều so với ksh.
/ bin / sh 83 8,96%
/ bin / csh 36 3,89%
/ bin / ksh 370 39,96%
/ bin / tcsh 36 3,89%
/ bin / bash 401 43,30%


0

Bash được chấp nhận rộng rãi do bộ tính năng phong phú của nó. Nó cũng áp dụng các tính năng từ các shell khác như C-shell và Korn-shell. Xin hãy xem các bộ tính năng này.


0

Bởi vì 'bash' có thể tương thích 100% 'sh / ksh' và 'ksh' là vỏ POSIX.

Vì vậy, nếu bạn muốn có một hệ thống tuân thủ POSIX, và bạn đang dùng Linux thì bạn sử dụng bash.

Nếu bạn đang sử dụng unix thương mại, bạn thường lấy ksh làm vỏ mặc định (đôi khi chỉ đơn giản là sh cũ). Vì một số lý do, Sun vẫn mặc định cho vỏ csh flakey.

Ưu điểm là tính di động .sh được viết cho hp-ux hoặc AIX có cơ hội tốt để chạy như một 'bash' linux mà không có bất kỳ thay đổi nào.


kshkhông phải là vỏ POSIX . Không có thứ gọi là vỏ POSIX . Có các shell phù hợp với đặc điểm kỹ thuật POSIX, kshlà một trong số đó, nhưng không có nghĩa là duy nhất.

0

Và để thêm vào tất cả các câu trả lời khác: zshkhông có nghĩa là tương thích ngược. Bạn có thể có thể thiết lập nó để nó tương thích, nhưng sau đó bạn sẽ mất các tính năng của nó.

Tôi sử dụng zshnhư là vỏ tương tác thông thường của tôi, nhưng bash/ dashdường như lành mạnh hơn đối với tôi như là một ngôn ngữ kịch bản lệnh shell; họ làm ít phép thuật hơn và dễ đoán hơn ... điều này quan trọng hơn với tôi khi tôi viết một kịch bản có nghĩa là hoạt động trong vài năm.


0

Chỉ cần nhầm lẫn các vấn đề, shlệnh đôi khi chỉ là một liên kết tượng trưng đến một chương trình shell khác, chẳng hạn như ash, bashhoặc dash.

Ubuntu được sử dụng để liên kết nó với bash, vì bashđược thiết kế để chạy bất kỳ tập lệnh shell Bourne tuân thủ nào.

Gần đây, mặc dù, Ubuntu đã chuyển sang có shliên kết đến dash. dashđược thiết kế để chạy bashcác tập lệnh (và cả shtập lệnh), nhưng nó được thiết kế để chỉ được sử dụng cho tập lệnh, vì vậy nó thiếu các tính năng tương tác của bash. Điều đó làm cho nó nhỏ hơn và (có lẽ) nhanh hơ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.