Sự khác biệt cơ bản giữa các vỏ * NIX chính là gì? [đóng cửa]


52

Sự khác biệt cơ bản giữa các shell * NIX chính thống và kịch bản nào có thể khiến bạn sử dụng cái này so với cái khác? Tôi hiểu rằng một số trong số đó có thể tùy thuộc vào sở thích của người dùng nhưng tôi chỉ từng sử dụng bash và tôi rất muốn biết nơi nào một vỏ khác có thể hữu ích.

Ngoài ra, có tác động đến các kịch bản shell do người dùng viết khi chạy dưới shell này hay shell khác hay đơn giản chỉ là vấn đề thay đổi shell ở đầu tệp? Bản năng của tôi nói rằng nó không dễ dàng như vậy.

Câu trả lời:


52

Để sử dụng tương tác, có hai ứng cử viên chính, bashzsh , cộng với tcsh straggler và mới .

  • Bash là shell chính thức của dự án GNU và shell mặc định trên hầu hết các bản phân phối Linux. Trên các thông báo khác không có vỏ tương tác tốt như là một phần của cài đặt cơ sở, tôi nghĩ bash là thứ mà mọi người có xu hướng lựa chọn, trong một bash tự gia cố có ở khắp mọi nơi nên tôi sẽ sử dụng nó quá vòng lặp. Xem thêm Tại sao bash ở khắp mọi nơi? (với rất nhiều thông tin lịch sử).

  • Zsh có hầu hết mọi tính năng của bash và nhiều tính năng (hữu ích!) Khác. Nhược điểm chính của nó là ít được biết đến, vì điều này thực tế có nghĩa là bạn ít có khả năng tìm thấy nó đã được cài đặt trên hệ thống mà người khác thiết lập và có ít tài liệu của bên thứ ba về nó. Xem thêm Bạn sử dụng tính năng zsh nào? , Những tính năng nào trong zsh và thiếu từ bash, hoặc ngược lại? .

  • Tcsh đã từng (đến đầu những năm 1990) vỏ với các tính năng tương tác tốt nhất, giống như csh tiền nhiệm của nó. Điều đó làm cho nó trở nên phổ biến để sử dụng tương tác (nhưng không phải cho kịch bản ). Zsh đã bắt kịp với tcsh và khá nhanh chóng cải thiện hơn nữa, và bash đã bắt kịp (với việc hoàn thành có thể lập trình) vào đầu những năm 2000, trong khi tcsh hầu như không đạt được tiến bộ nào trong 15 năm qua. Vì vậy, có rất ít lý do để học tcsh bây giờ.

  • Cá cố gắng sạch hơn người tiền nhiệm. Nó có một số tính năng gọn gàng (cú pháp đơn giản hơn, tô màu cú pháp trên dòng lệnh) nhưng thiếu các tính năng khác (bất cứ điều gì tác giả không thích). Cộng đồng cá nhỏ hơn rất nhiều so với zsh, khiến cho các hiệu ứng trở nên gay gắt hơn.


Đối với tập lệnh, có một số ngôn ngữ bạn có thể muốn nhắm mục tiêu, tùy thuộc vào mức độ di động mà bạn muốn tập lệnh của mình.

  • Bất cứ thứ gì giả vờ giống Unix đều có vỏ được Bourne tạo ra /bin/sh. Vẫn còn một số thông báo thương mại xung quanh nơi /bin/shkhông tuân thủ POSIX .

  • Hầu như mọi unix hiện đang chạy đều có một shtệp thực thi ít nhất tuân thủ ít nhất POSIX.2-1992 và thường ít nhất là POSIX: 2001 hay còn gọi là Unix v3 đơn . Vỏ này có thể sống trong một thư mục khác nhau như /usr/bin/posixhay /usr/xpg6/bin. Các lớp mô phỏng POSIX cũng tồn tại cho mọi hệ thống đủ mạnh để hỗ trợ nó, khiến nó trở thành mục tiêu hấp dẫn.

  • Nhiều hệ thống unix có ksh93 , mang lại một số tính năng rất hữu ích mà POSIX sh thiếu (mảng, mảng kết hợp, những đống mở rộng ( *(foo), @(foo|bar), ...), null globs ( ~(N)foo*), ...). Ksh ban đầu là phần mềm thương mại (nó trở nên miễn phí vào năm 2000, sau khi một số thói quen đã được thiết lập) và nhiều hiệp hội miễn phí (Linux, * BSD) đã có thói quen chỉ cung cấp một bản sao miễn phí cũ hơn ( pdksh ) thiếu nhiều tính năng hữu ích này . Pdksh hiện đang bị thay thế bởi mksh bên ngoài OpenBSD, nhưng ngay cả mksh cũng không thực hiện được tất cả các tính năng của ksh93. Ngày nay, bạn không thể tin vào ksh93 có sẵn ở mọi nơi, đặc biệt là trên Linux, nơi bash là chuẩn mực.

  • Bash luôn có sẵn trên Linux (ngoại trừ một số biến thể nhúng) và thường trên các thông báo khác. Nó có hầu hết các tính năng hữu ích của ksh93, mặc dù đôi khi với một cú pháp khác nhau.

  • Zsh có hầu hết các tính năng hữu ích của ksh93 và bash. Cú pháp cốt lõi của nó sạch hơn nhưng không tương thích với Bourne. Ngoại trừ macOS, đừng tin vào zsh có sẵn trên hệ thống bạn chưa cài đặt.

  • Để có kịch bản nâng cao hơn, bạn có thể chuyển sang Perl hoặc Python . Các ngôn ngữ này có cấu trúc dữ liệu phù hợp, các tính năng thao tác văn bản phù hợp, cơ chế kết hợp và truyền thông hợp lý và hàng tấn thư viện có sẵn. Hầu hết các hệ thống unix đều có chúng, được gói cùng với HĐH hoặc được quản trị viên cài đặt (vì có rất nhiều tập lệnh Perl và Python ngoài đó là một hệ thống hiếm hoi không có ít nhất một trong số đó).


4
Để tạo kịch bản, tôi nhắm mục tiêu dấu gạch ngang, (trừ khi tôi cần các tính năng nâng cao của bash) có bộ tính năng tối thiểu và là khiếu nại tích hợp để tương thích tối đa. (và nó là ánh sáng nhỏ và nhanh)
hildred

Tài liệu tuyệt vời! Hai lưu ý. Đầu tiên, Solaris là một trong những "hợp nhất thương mại xung quanh nơi / bin / sh không tuân thủ POSIX." Cụ thể, nó sử dụng jsh( không phải là java shell!), Thiếu thay thế như ${VAR#foo}${VAR%bar}.
Adam Katz

Thứ hai, tcshlà khá phổ biến đối với người dùng UNIX người học được thủ đoạn của họ trước khi ~ giữa những năm 90 (mà nhìn thấy sự ra đời của cả hai bashzsh), đặc biệt là trong những + cũ UNIX Cnhà phát triển, người bắt đầu cuộc sống với csh(nhắc nhở, các c trong cshlà viết tắt cho các Cngôn ngữ , đó là nguồn cảm hứng cho sự khác biệt của nó từ vỏ kiểu bourne). Xem thêm lập trình Csh được coi là có hại , mà tôi thường sử dụng cho các mẹo về ma thuật sâu POSIX (ngoài các đối số chống csh của nó).
Adam Katz

Mac OS X không bao giờ là "OS / X". (: Và làm thế nào zsh không tương thích với Bourne? (Chà, ngoại trừ những thứ như không mở rộng biến chia tách từ.)
SilverWolf - Phục hồi Monica

@seaturtle Không phải mở rộng biến chia tách từ là sự khác biệt lớn sẽ phá vỡ nhiều tập lệnh sh nếu bạn cố chạy chúng với zsh (trừ khi bạn chạy zsh trong chế độ mô phỏng sh / ksh).
Gilles 'SO- ngừng trở nên xấu xa'

27

Có hai hương vị cơ bản của vỏ, sh (ví dụ: bash) và csh (ví dụ: tcsh). Để sử dụng tương tác, nó chủ yếu dựa vào những gì bạn đã quen. Tôi đã sử dụng csh, và sau đó là tcsh, trong nhiều năm và sẽ rất khó để chuyển đổi, chỉ vì tôi đã quá quen với nó. Tôi cũng đã sử dụng bash và tôi không nghĩ có bất kỳ lý do thuyết phục nào để chuyển đổi. Ngoại trừ có thể nếu cái này hay cái kia không có sẵn trên các máy mà bạn thường xuyên sử dụng.

Đối với lập trình, cú pháp là khác nhau. Bạn không thể thay đổi trình bao, nhưng cũng cần thay đổi cú pháp của tập lệnh. Đối với kịch bản, bạn muốn sử dụng sh hoặc bash. Cú pháp phù hợp hơn với kịch bản, như được giải thích ở đây (cảm ơn Riccardo Murri cho liên kết. Đây là một hướng dẫn tốt về kịch bản bash.

Nếu bạn chưa quyết định về trình bao và bạn muốn viết một số tập lệnh, tôi sẽ sử dụng bash chỉ để giảm số lượng những thứ bạn cần học.


12

Quay lại thời xưa, khi AT & T phát minh ra UNIX, có Bourne Shell, được viết bởi Steve Bourne. Nó khá cơ bản và thiếu rất nhiều công cụ mà chúng ta sử dụng ngày nay.

AT & T không thực sự hoạt động trong lĩnh vực kinh doanh UNIX, vì vậy tại thời điểm này, hệ điều hành rất cơ bản đã được Berkelely chấp nhận và họ đã thực hiện một số thay đổi trong BSD UNIX. Trong số nhiều thay đổi, có một lớp vỏ mới, được gọi là csh, có rất nhiều cải tiến so với sh, bao gồm kiểm soát công việc sử dụng tương tác tốt hơn, v.v. Thật không may, họ đã quyết định cú pháp lập trình sh bị hút và tạo riêng, (hơi tệ) được sao chép từ các kiểu mã hóa C. (Một câu thần chú cổ điển là http://www.faqs.org/faqs/unix-faq/shell/csh-whynot/ ) Vì vậy, bây giờ có hai cú pháp.

Sau đó, họ đã thực hiện các cải tiến để thêm CSH hoàn thành tab và một số thứ khác. Điều này đã trở thành tcsh, và nếu bạn sử dụng CSH, đây có thể là cái bạn sử dụng.

AT & T đã quyết định rằng nó không hoàn toàn nằm ngoài hoạt động kinh doanh của UNIX và họ cũng đã đánh bóng nó. David Korn (anh chàng tốt bụng) đã tạo ra vỏ Korn. Dựa trên ý tưởng mở rộng cú pháp shell Bourne, nó đã bổ sung rất nhiều thứ cho cả lập trình viên và sử dụng tương tác. Thực tế có một vài phiên bản, và bạn hiếm khi thấy những thứ như ksh88 và ksh93, biểu thị các biến thể.

Sau đó đến FSF và hệ điều hành GNU. Họ muốn tạo ra HĐH tương thích UNIX của riêng họ có tên Hurd và muốn có lớp vỏ tốt hơn cho nó. Họ gọi bash, vì Bourne Again SHell. Quy tắc POSIX đến chỉ trong khoảng thời gian này, và họ muốn làm các vỏ POSIX. Họ nhìn xung quanh, lấy cú pháp từ vỏ Bourne và các cải tiến từ vỏ Korn, cộng với việc đánh cắp và mở rộng các tính năng tương tác từ tcsh. Nó đã trở thành lớp vỏ thực tế trên Linux, vì vậy nó rất phổ biến.

Ngoài ra còn có zsh, được viết là vỏ 'tối thượng'. Nó cũng rất phổ biến trong thế giới Linux. Nó mở rộng bash (và thụ phấn chéo một chút, một số điều mới quay trở lại bash).

Nếu tôi chọn một cái vỏ, tôi sẽ chọn bash hoặc zsh. bash có thể ở một vài nơi hơn zsh. zsh mạnh hơn, nhưng bash vẫn ổn với tôi. Real / bin / sh Bourne shell xuất hiện chỉ vì lý do lịch sử. bash có khá nhiều tất cả những gì ksh cung cấp và nhiều hơn nữa. Cú pháp sạch hơn csh hoặc tcsh và có các tính năng tốt hơn một trong số chúng.

Để chuyển đổi một tập lệnh phụ thuộc vào những gì. Kiểu vỏ Bourne (sh, ksh, bash, zsh) đến hoặc từ kiểu csh (csh, tcsh) sẽ khó. Đi từ cũ sang mới hơn (/ bin / sh => bash, / bin / ksh => zsh) sẽ dễ dàng hơn so với cách khác.


Xin lưu ý rằng trang csh-whynot đã được viết lại vào tháng 9 năm 1995 (kiểm tra thẻ phiên bản ở trên cùng). Tôi không biết, nhưng tôi sẽ mong đợi nhiều thứ sẽ thay đổi trong 18 năm kể từ đó.
một CVn

8

Hai nhánh chính của vỏ là các dẫn xuất vỏ Bourne (sh, bash, ksh, ash, yash và zsh) và các dẫn xuất csh (tcsh và ... uhm ... tcsh).

Tôi nghi ngờ (mặc dù tôi không có số thực tế) rằng bash được sử dụng rộng rãi nhất, nó dường như là vỏ mặc định trong hầu hết các linux.

Hầu hết những điều được viết bằng một dẫn xuất vỏ bourne có thể sẽ hoạt động ở những người khác. Hầu hết mọi thứ được viết bằng shell Bourne có thể sẽ cần phải được sửa đổi để chạy theo csh hoặc tcsh.

Cá nhân tôi đã sử dụng ksh khi tôi bắt đầu vì đó là những gì trên hệ thống tôi đang sử dụng. Tôi chủ yếu sử dụng bash bây giờ.


1
cá là một vỏ lấy cảm hứng từ csh
hildred

1

Tôi đã sử dụng nhiều vỏ theo thời gian. Không phải bất cứ điều gì siêu tiên tiến nhưng rất nhiều sysadmin thực tế và các công cụ lập trình đã yêu cầu đủ tùy chỉnh.

Tôi nghĩ rằng zsh có nhiều tùy chọn tùy chỉnh hơn, ít nhất là nó đã từng sử dụng, nhưng sau khi sử dụng nó trong một vài năm, tôi đã có đủ với sự ổn định và các vấn đề mã hóa ký tự của nó. Bash là đá rắn, không bao giờ có vấn đề tương tự và nó được cài đặt ở khắp mọi nơi.

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.