Có bất kỳ lý do để sử dụng bash trên zsh? [đóng cửa]


33

Tôi tò mò về lý do tại sao một người muốn chạy bash thay vì zsh. Ý tôi là zsh hoàn toàn tương thích ngược với bash. Đừng hiểu lầm tôi: Tôi không thích bash hay bất cứ điều gì. Tôi thực sự muốn biết nếu có bất kỳ lợi thế để sử dụng nó qua zsh.

Vậy lý do nào để sử dụng bash trên zsh?


2
Chỉ muốn chỉ ra rằng ZSH không tương thích hoàn toàn với BASH. Trong ZSH, lập chỉ mục mảng bắt đầu từ 1 - trong BASH, lập chỉ mục mảng bắt đầu từ 0. Cũng có những khác biệt khác, nhưng tôi muốn chỉ ra điều này.
Charles Addis

Câu trả lời:


29

Hai lý do xuất hiện trong tâm trí:

Đầu tiên - nó có sẵn trên thực tế ở mọi nơi. Tôi có một số hệ thống Linux (CentOS 4.x trong trường hợp này) chưa cài đặt zsh. Tương tự, tôi phải chạm vào các hệ thống cổ xưa như Solaris 2.6 trở lên, HP-UX 10 trở lên và các phiên bản AIX khó hiểu tương tự. Do đó, tôi phải sử dụng bash trên các máy tính này, điều mà tôi làm vì tôi chạm vào hàng chục, chứ không phải hàng trăm máy tính cá nhân trong suốt một tháng và để có được sự thống nhất trong giao diện của bạn, cuối cùng bạn bị kẹt khi sử dụng mặc định

Thứ hai - nó có sẵn trên thực tế ở mọi nơi. Điều này có nghĩa là tôi có thể viết một tập lệnh bash shell và chắc chắn 99% rằng nó sẽ hoạt động khi được chuyển đi nơi khác.

Vâng, những lý do này là bề ngoài giống nhau, nhưng lý do đằng sau chúng là khác nhau.


2
Tôi nhớ có ksh88 / ksh93 trên HPUX, chúng tôi chưa bao giờ có quyền truy cập để cài đặt bash.
Zlemini

24

Bash thường đi kèm với mọi hệ thống, zsh không. Tôi yêu zsh, nhưng vì điều này, tôi sử dụng zsh để sử dụng tương tác, nhưng Bash cho tất cả các kịch bản của tôi .

Tôi thấy điều này giúp mọi thứ đơn giản hơn, vì ngay cả khi tôi mua sắm bất cứ thứ gì tương thích với bash (setopt SH_WORDinksLIT?), Tôi vẫn gặp phải những khác biệt tinh tế.


3
Đó có nghĩa là mọi hệ thống GNU / Linux?
andol

2
Chà, tôi đã tìm thấy nó đi kèm với OS / X và bsd, tôi không có nhiều kinh nghiệm với các * nix khác, có phải chúng (các phiên bản gần đây) thường không có bash không?
Kyle Brandt

1
Các phiên bản Solaris cũ hơn không bao gồm bash; Tôi thường phải phụ thuộc vào Bourne là vỏ cho kịch bản. Điều này đã không xảy ra trong một thời gian, nhưng bạn vẫn có thể gặp phải nó trong một số doanh nghiệp lớn.
user5336

3
Phải khác BSD: s rồi. Ít nhất là trong OpenBSD và trong FreeBSD, bạn phải cài đặt bash riêng với các cổng / gói.
andol

andol: Đó là những cái tôi đã từng sử dụng .. Tôi phải nhớ không chính xác, hoặc tôi đã làm điều đó và chỉ không nhớ.
Kyle Brandt

13

zsh không hoàn toàn tương thích bash. Có nhiều sự khác biệt. Zsh mới tương thích hơn với bash (= ~ được hỗ trợ, hiện tại exec có thêm tùy chọn cờ, v.v.) nhưng khả năng tương thích hoàn toàn không phải là mục tiêu, thậm chí không được "mô phỏng".

Chẳng hạn, chuỗi con bash là $ {foo: offset: len} nhưng trong zsh, nó là $ foo [bắt đầu, kết thúc] và đó chỉ là một ví dụ đơn giản.

zsh là một vỏ ảnh hưởng tcsh và ksh, thực hiện nhiều thứ theo cách riêng của nó; Khả năng tương thích POSIX rõ ràng không phải là một mục tiêu, nhưng các nhà phát triển phản ứng nhanh với các bản vá có thêm tùy chọn / mô phỏng hành vi giúp mọi thứ trở nên gần gũi hơn với POSIX. Nhưng khi bạn bắt đầu thực sự đi vào sức mạnh của trình bao, bạn bắt đầu tạo các tập lệnh chỉ viết, thậm chí còn hơn cả bash.

bash là POSIX sh + ksh + pedanticism, với một số tính năng hiện được sao chép từ zsh. Nó cũng có các tập lệnh chỉ viết nhưng vì nó có các toán tử ít mạnh hơn, cuối cùng bạn không sử dụng tính đơn giản của zsh và mọi thứ thể dễ đọc hơn (ngoại trừ tất cả các trích dẫn để tránh phân tách khoảng trắng, mảng $ ksh-style ngu ngốc có nghĩa là trước tiên -element-of-mảng, không phải tất cả các phần tử của mảng, v.v.).

Viết các tập lệnh tận dụng tối đa sức mạnh của một trong hai lớp vỏ là không khôn ngoan, trừ khi bạn ở trong một môi trường bị hạn chế (ví dụ, viết các tập lệnh RC hệ thống, trong đó một số FS có thể không được gắn, v.v.). Như một lý tưởng, sử dụng Perl / Python / Ruby / bất cứ thứ gì đủ lớn để bạn cần sự biểu cảm không có trong Bourne sh, nếu bạn muốn người khác có thể duy trì nó. Giữ công cụ shell cho những thứ liên quan đến shell tương tác (lập trình hoàn thành tab, v.v.).

Tôi sẽ không sử dụng bash trên zsh. Tôi sẽ sử dụng zsh zsh cho các tập lệnh đơn giản hoặc chuyển sang ngôn ngữ nơi các mảng kết hợp có các toán tử hợp lý (không giống như trong zsh, một lần nữa, chúng là 'súc tích'). Tôi có thể chuyển tập lệnh sh thành bash nếu tôi cần một tính năng nhỏ đó để mở rộng tập lệnh đã được chứng minh hiện có và không có thời gian để viết lại tập lệnh đó ngay bây giờ.


6
nb: $ {foo: offset: len} được hiện được hỗ trợ trong zsh, để tương thích.
Phil P

6

Lời khuyên của tôi: nếu bạn muốn có tính di động tuyệt đối, hãy viết bằng cách sử dụng quy tắc shell Bourne, thậm chí đừng bận tâm với các tiện ích mở rộng vỏ Korn. Như đã đề cập, đó là một số "hộp lớn" cũ hơn xung quanh không có vỏ GNU trên chúng.

Bash đã làm "quá nhiều". Tôi có một người bạn làm việc thích zsh, nhưng tôi không biết chính xác nó làm gì.

Dù sao, hãy viết cho shell Bourne (hoặc "bourne again") hoặc thay vào đó, nếu bạn đang thực hiện một tập lệnh tùy chỉnh cho một số lượng nhỏ các hộp cụ thể, bỏ qua hoàn toàn "shell hell" và chỉ viết bằng perl hoặc python (hoặc bất cứ điều gì thông dịch viên cài đặt yêu thích của bạn là).


5

Ngoài lý do tính di động được đưa ra ở trên, một lý do khác có thể là bash vẫn đang thêm các tính năng.

Ví dụ: bash v4.x + được giới thiệu:

  • đệ quy đệ quy:

    rm -f ** / *. log

  • tự động:

    Nhập "/ tmp" thay vì "cd / tmp"


2
Làm thế nào là tính năng sao chép bash từ zsh một lý do để sử dụng bash?
qqx

5

Nhân tiện, bạn đã được nói ở đây nhiều lần rằng bash được tìm thấy thực tế ở mọi nơi, vì vậy hãy sử dụng nó để viết các tập lệnh di động, đó là sai.

Vô lý. Nếu bạn biết rằng mọi hệ thống bạn quan tâm đều có BASH thì đó là một tuyên bố hoàn toàn hợp lý. BASH có nhiều tính năng hữu ích không thể mô phỏng hợp lý trong POSIX sh. Việc sử dụng các tính năng không phải POSIX phù hợp không phải là một ý tưởng tuyệt vời nhưng sử dụng chúng khi bạn thực sự cần chúng là ổn.

Tính di động không phải là một tuyệt đối. Người ta cho rằng bạn cần phải đi bao xa, giống như mọi thứ khác. Ví dụ: Fedora sử dụng các lệnh shell để xây dựng các gói RPM và hướng dẫn đóng gói của Fedora nói rằng vì tất cả các gói phải được xây dựng tự nhiên trên Fedora, nên sử dụng tất cả các tính năng của BASH là tốt. Mặc dù về mặt lý thuyết, các distro khác không có BASH có thể muốn sử dụng lại RPM nguồn của họ, họ đã đưa ra quyết định về tính di động dựa trên tính thực tế thay vì câu thần chú "LUÔN LUÔN POSIX !! 1" của bạn.

ZSH đã không được coi là một vỏ mặc định, đơn giản vì đó là một mớ hỗn độn của những ý tưởng nửa vời.


2
Bạn có thể giải thích những tính năng hoặc ý tưởng trong zsh mà bạn thấy là nửa nướng không và tại sao?
funroll

2

Nhân tiện, bạn đã được nói ở đây nhiều lần mà bashthực tế được tìm thấy ở mọi nơi, vì vậy hãy sử dụng nó để viết các tập lệnh di động, đó là sai .

Cách đúng để viết các tập lệnh unix di động là sử dụng sh, được tìm thấy trong mọi hệ thống * nix .

Mọi vỏ khác ngoại trừ shchỉ là một công cụ tương tác hàng ngày của bạn.

Khi đến bashvs zsh- bashđược gói nhiều *nixeshơn zsh, do đó, có những nhược điểm của việc cài đặt phần mềm bổ sung cho hệ thống - bạn phải duy trì nó. Một số người thích zsh "tính năng mát mẻ" vì vậy họ thích trả giá đó, một số thì không.


2
Nhiều triển khai hiện đại của sh chỉ là liên kết đến bash.
user9517 hỗ trợ GoFundMonica

2
@Iain Ubuntu sử dụng dấu gạch ngang theo mặc định và ngay cả khi shbash, nó cho phép chế độ tương thích khi chạy dưới dạng sh.
mgorven

2

Điểm khác:

Nhiều chương trình cung cấp hoàn thành bash mát theo mặc định. Đối với tôi đó là lý do để không chuyển đổi.

. . :).


3
Tôi nghĩ rằng nó cũng hoạt động với ZSH, với việc hoàn thành tab trong ZSH, tôi nhận được rất nhiều đối số cụ thể của chương trình ...
Kyle Brandt

Hấp dẫn. Bạn đang nói rằng các tệp hoàn thành bash hoạt động với zsh, hoặc chỉ một số chương trình có công cụ hoàn thành dành riêng cho zsh của nó? Vẫn có một số bố cục tiêu chuẩn của các tệp hoàn thành bash mà zsh có thể hoặc không thể xem xét tự động. Bạn đã điều chỉnh cấu hình zsh của bạn để làm cho nó hoạt động?
Wojciech Kaczmarek

@Wojciech Kaczmarek: Tôi nghĩ rằng bạn muốn 19.3 từ sau: zsh.sourceforge.net/Doc/Release/zsh_19.html . Thành thật mà nói, tôi không bao giờ dành thời gian để thực sự hiểu về nó, chỉ cần xé một .zshrc tôi tìm thấy trên mạng :-) Nhưng nó sẽ hoàn thành các đối số dòng lệnh từ các chương trình như apt, grep, v.v ....
Kyle Brandt

5
Hoàn thành tab của bash rất giống với hệ thống hoàn thành tab cũ của zsh. Đây là một trong những ý tưởng được sao chép từ zsh sang bash (có những ý tưởng khác được sao chép bash sang zsh). Bạn có thể sử dụng các tập lệnh hoàn thành được viết cho bash trong zsh, bằng cách chạy "bashcompinit" và sau đó sử dụng các lệnh "hoàn thành" và / hoặc "compgen" bên trong zsh - điều này là có thể bởi vì chức năng bash là một tập hợp con có sẵn trong zsh và vì vậy có thể được mô phỏng. Vì vậy, không có lý do để chuyển sang bash vì một tàu chỉ huy hoàn thành bash.
Phil P
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.