Tại sao bash shell mặc định trong hầu hết các hệ điều hành?


38

Tại sao bash shell mặc định trong hầu hết các hệ điều hành (Ubuntu, Fedora, OSX, v.v.)? Tại sao nhiều người dùng cao cấp chủ yếu sử dụng zsh? Nếu nó là tốt, tại sao nó không phải là mặc định?

Tôi sử dụng cả hai Tôi không thấy sự khác biệt cho tất cả các nhiệm vụ của mình là đơn giản :)


5
Mọi thứ đều là một đường cong Gaussian: nếu đúng là hầu hết người dùng cao cấp đều sử dụng ksh, thì cũng đúng là hầu hết mọi người sử dụng một lớp vỏ khác, và chính điều này sẽ giải thích tại sao kshkhông phải là lớp vỏ mặc định. Tuy nhiên tôi không nghĩ đó là lý do, chúng ta hãy chờ câu trả lời của kẻ giết người mà tôi chắc chắn câu hỏi này sẽ nhận được.
kos

1
Trên thực tế, tôi tin rằng Ubuntu sử dụng dash làm vỏ mặc định ...
Bakuriu

1
Điều này có một câu trả lời tốt, tôi bỏ phiếu chúng tôi để nó mở.
Seth

Câu trả lời:


33

Tôi đã đọc một số điều về điều này và kết luận dường như là lớp vỏ mặc định của GNU (được sử dụng bởi hầu hết các hệ điều hành Linux), và do đó đơn giản được đóng gói như một phần của GNU, trong khi cũng có 20 năm phát triển đằng sau nó. ổn định và làm tròn tốt, nó đơn giản là tốt nhất tất cả các rounder, đáp ứng nhu cầu của tất cả nhưng người dùng cao cấp nhất.

Để biết thêm, hãy đọc Tại sao bash tiêu chuẩn trên Linux? (câu hỏi tương tự trên Unix & Linux).

Chỉ cần thêm một chút vào điều này, có rất nhiều vỏ khác để thử, nếu bạn quan tâm, đây là một vài từ câu trả lời này :

  • Zsh có các phương tiện tương tác tiên tiến hơn, nhưng một vài điều kỳ quặc khi nói đến kịch bản (ít hơn bây giờ so với trước đây). Vào đầu những năm 1990 đến khi Linux còn ở giai đoạn đầu, zsh hầu như không được biết đến.

  • Ksh là tiêu chuẩn thực tế trên các đơn vị thương mại từ giữa những năm 1980, nhưng nó là phần mềm độc quyền cho đến năm 2000, do đó không phải là một tùy chọn trên Linux. Ngoài ra, ksh có khả năng chỉnh sửa dòng lệnh phụ, so với bash.

  • Pdksh , một bản sao miễn phí của ksh, sẽ là một lựa chọn, nhưng nó không nổi tiếng và có khả năng phiên bản dòng lệnh kém. (Pdksh không còn là một dự án rất tích cực, mặc dù nó vẫn được sử dụng trong một số BSD, nhưng bây giờ ATT ksh là miễn phí.)

  • Một số bản phân phối cài đặt một biến thể tro như /bin/sh. Tro (theo ý tôi là bất kỳ họ vỏ lỏng lẻo nào được gọi là tro) được thiết kế nhỏ và nhanh, không có tính năng tương tác (chỉ dành cho chỉnh sửa tập lệnh). Sự hồi sinh tro tương đối gần đây; trong những năm 1990, các biến thể hiện có thiếu rất nhiều tính năng.

  • Tcsh là trình vỏ tương tác tiên tiến nhất cho đến khi zsh xuất hiện, nhưng nó không tương thích với sh và không tốt lắm với kịch bản .


1
Khi bạn sao chép-dán những thứ từ nơi khác, bạn phải chỉ ra rõ ràng rằng đây là trường hợp.
muru

1
@muru Tôi đã cung cấp liên kết đến bài viết gốc, nhưng tôi thấy quan điểm của bạn rằng nó có thể rõ ràng hơn.
Đánh dấu Kirby

Nguồn bình luận của bạn là gì mà zsh có một vài điều kỳ quặc liên quan đến kịch bản? Không sao, tôi thấy rằng bình luận đến từ nơi khác.
Xe tay ga

1
Bạn cũng có (không tương thích với cú pháp sh).
Léo Lam

1
Bạn có thể giải thích những gì còn thiếu về chỉnh sửa vỏ Korn? Nó dường như luôn hoạt động tốt với tôi, ngay cả trong những năm 90.
Jonathan Leffler

9

Shell Bourne ( sh back in the day) của chi nhánh AT & T của Unix đã được cải tiến và áp đảo bởi Korn Shell, ksh . ksh cũng đã ra khỏi AT & T Bell Labs và không phải là GPL (phiên bản hiện tại là Giấy phép Công cộng Eclipse). Shell C, csh ra đời từ phiên bản Unix của Unix và cũng không phải là GPL (giấy phép BSD) và cũng sử dụng cú pháp khác với sh. Z-shell, zsh là một cải tiến trên sh nhưng không phải GPL (giấy phép giống như MIT). Bash là một cải tiến trên sh, đã sử dụng GPL và từ GNU. Chỉ có giấy phép thôi, Bash có lẽ đã là lựa chọn cho hệ điều hành GPL. Đặc biệt với vỏ là một phần cốt lõi của một bản phân phối.

Nhưng Bash cũng là một dự án GNU, tôi nghĩ rằng, phát triển tích cực hơn và đóng góp dễ dàng hơn một sản phẩm kế thừa từ Berkeley Unix hoặc AT & T Unix. Một trường hợp rất tốt có thể được thực hiện rằng zsh là và là một vỏ tốt hơn Bash, nhưng không đủ để vượt qua tình trạng giấy phép và trạng thái dự án không phải là GNU.

Quay lại khi các bản phân phối Linux lần đầu tiên xuất hiện và chọn lớp vỏ mặc định của chúng (đầu đến giữa những năm 90), không có github (2008) hay thậm chí là SourceForge (1999). Vào thời điểm đó, tôi nghĩ các dự án GNU có lợi thế thực sự so với các dự án không phải GNU trong việc thu hút sự chú ý và vẽ và bao gồm cả các nhà phát triển mới. Vì vậy, các distro có thể nhìn vào Z-shell tốt hơn, nhưng cũng hy vọng rằng Bash sẽ nhận được sự hỗ trợ và bảo trì tốt trong tương lai, và cũng có nhiều tính năng được thêm vào nó, cho phép nó bắt kịp zsh.

Bây giờ Bash đã có nhiều năm ở trạng thái mặc định, nó trở thành một tiêu chuẩn defacto, với những cuốn sách viết về nó. Có một cuốn sách bao gồm cả Bash và Z-shell , nhưng không có cuốn sách nào nói riêng về nó, trong khi có nhiều cuốn sách làm như vậy cho Bash.

Và tại thời điểm này, nếu các distro thay đổi mặc định để nâng cấp hệ thống hiện có, nó sẽ phá vỡ các thiết lập vì một số tệp khởi tạo có tên khác nhau (ví dụ: .bashrc so với .zshrc) và nội dung của các tệp có thể có cú pháp không tương thích. Vì vậy, họ sẽ rất miễn cưỡng làm điều đó, để lại các bản tải xuống mới có zsh làm mặc định và nâng cấp để có bash. Hai mặc định khác nhau cho cùng một bản phân phối là điều mà có lẽ họ không muốn phải hỗ trợ và người dùng / công ty cũng không muốn giải quyết.


1

Các ngôn ngữ shell Unix đều xấu. Một số đặc biệt ( csh), một số có thể ít hơn một chút ( ksh? Tôi thực sự không biết), nhưng thực sự khi nói đến các khía cạnh như dễ đọc và cứng nhắc cho các dự án lớn, không ai trong số họ có thể gần gũi với các ngôn ngữ có mục đích chung được thiết kế tốt như Python, C # hoặc Haskell. Vì vậy, khi bạn muốn một cái gì đó vững chắc, bạn sẽ không bao giờ chọn bất kỳ hương vị vỏ nào cả.

Bạn chọn chúng khi bạn muốn nhanh chóng hoàn thành công việc đơn giản. Đối với điều này, bạn cần:

  • Cú pháp súc tích và đủ tính nhất quán để bạn thực sự có thể ghi nhớ nó (thật khó để tìm kiếm các toán tử tốc ký). Nó rất quan trọng nếu vỏ của bạn được cài đặt ở mọi nơi, bởi vì bạn thực sự sẽ không ghi nhớ nhiều hơn một trong những con quái vật bùn này.
  • Các tính năng tương tác tốt, vì vậy bạn có thể hack ngay vào thiết bị đầu cuối và làm cho mọi thứ hoạt động mà không phải chuyển đổi giữa nhiều tệp tập lệnh.
  • Khả năng lấy bất kỳ đoạn script nào từ bất cứ đâu và có nó chỉ hoạt động. shkhả năng tương thích là một điểm cộng lớn ở đây, và một lần nữa càng phổ biến thì càng tốt.

Vì vậy, bạn thấy, sự phổ biến là một điểm lớn hơn trong các ngôn ngữ shell này so với các ngôn ngữ có mục đích chung. Do đó, ngay cả khi kshbản thân nó là ngôn ngữ tốt hơn một chút, thì thực sự không có quá nhiều sự ủng hộ trong việc sử dụng nó nếu nó bashchỉ phổ biến hơn một chút (trong lĩnh vực có liên quan, vì nó được chọn làm mặc định đầu tiên cho GNU).

Những người thực hiện chuyển đổi đang cân nhắc về nó và đủ kinh nghiệm để dễ dàng xử lý việc chuyển sang vỏ yêu thích của họ. OTOH, một tân binh bị buộc phải làm việc với lớp vỏ ít phổ biến hơn sẽ nhanh chóng bị nhầm lẫn nếu họ hỏi internet về một cái gì đó và nó không hoạt động. Do đó, bất kỳ bản phân phối nào không chỉ nhắm vào các cựu chiến binh Unix đều gặp khá nhiều rủi ro nếu nó tạo ra bất cứ thứ gì ngoài bashtiêu chuẩn, một bước mà tương đối ít người sẽ có lợi (và chỉ một chút).


1
Bất kỳ ngôn ngữ nào quan tâm đến số lượng khoảng trắng không được "thiết kế tốt", nhưng tôi đồng ý rằng sự phổ biến là chìa khóa.
Nagora

1
@Nagora: ý kiến ​​khác nhau. FWIW, bạn luôn có thể viết Haskell bằng dấu ngoặc và dấu chấm phẩy thay vì khoảng trắng và tôi cho rằng Python có dự phòng tương tự. Chỉ, không ai làm điều này, bởi vì nhóm dựa trên thụt đầu dòng chỉ là tuyệt vời cho khả năng đọc.
leftaroundabout

1
  1. Nó đã ở đó khi cần
  2. Nó có đủ kẹo mắt mà người dùng bắt đầu có thể dành một tuần để tùy chỉnh lời nhắc của họ.
  3. Các trường hợp sử dụng phổ biến là đủ tốt (phổ biến nhất là bắt đầu một lệnh)
  4. Trường hợp nó không đủ tốt perl, python và lua có thể mất đi sự chậm chạp.
  5. perl làm cho một vỏ tương tác khủng khiếp
  6. Mặc dù về mặt lý thuyết, cá, ksh hoặc zsh có thể là một vỏ tốt hơn nhưng tôi không bận tâm lắm khi perl hoạt động tốt hoặc tính di động là một vấn đề vì vậy dù sao tôi cũng nhắm mục tiêu.

0

"Khối lượng quan trọng" là câu trả lời chính, IMO. Bash không chỉ dành cho công việc dòng lệnh, nó còn dành cho kịch bản và có một số lượng lớn các tập lệnh Bash ngoài kia. Cho dù bây giờ có sự thay thế nào tốt hơn cho tương tác hay không, thì cần phải có khả năng "cắm và phát" các tập lệnh đó vượt xa các lợi thế như vậy. Như vậy, lớp vỏ duy nhất có thể giải phóng Bash thực tế bây giờ là lớp vỏ hoàn toàn tương thích ngược và ứng cử viên có khả năng nhất cho điều đó là ... phiên bản tiếp theo của Bash.


1
Bạn có thể sử dụng bất kỳ và tất cả các tập lệnh bash bất kể shell mặc định của bạn là gì. Đó là ý nghĩa của cô ấy (#! / Bin / bash) ở đầu kịch bản.
Panther

1
@ bodhi.zazen Miễn là vỏ bash tồn tại trong hệ thống. Tôi đã biết ít nhất một phiên bản Solaris không bao gồm bash.
Tulains Córdova

@ bodhi.zazen Có một chi phí tinh thần khi phải chuyển đổi giữa hai hệ vỏ - một cho tương tác và một cho kịch bản. Nó thường không đáng bận tâm.
Nagora

1
@Nagora Chi phí tinh thần của việc chạy một kịch bản là gì?
kos

@kos nếu bạn thực sự chỉ chạy tập lệnh, không có. Nếu bạn phải duy trì và điều chỉnh các tập lệnh thì bạn cần lưu ý những khác biệt khá nhỏ giữa các shell cơ bản khác nhau, trong trường hợp đó là chi phí kim loại đang diễn ra và chi phí chuyển đổi ngữ cảnh khi bạn phải thực hiện một số công việc trong Cú pháp "khác".
Nagora
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.