Các tính năng độc đáo của bash so với zsh


67

Tôi đã là một người dùng zsh trong một thời gian khá lâu (trước đó là tcsh và trước đó là csh). Tôi khá hài lòng với nó, nhưng đã tự hỏi nếu có bất kỳ tính năng hấp dẫn nào của bash không tồn tại trong zsh. Và ngược lại, có các tính năng zsh không tồn tại trong bash. Cảm giác hiện tại của tôi là bash là tốt hơn:

  • Nếu bạn đã quen thuộc với nó và không muốn học cú pháp mới.
  • Nó sẽ tồn tại trên hầu hết tất cả các máy * nix theo mặc định, trong khi zsh có thể là một cài đặt bổ sung.

Không cố bắt đầu một trận chiến tôn giáo ở đây, đó là lý do tại sao tôi chỉ tìm kiếm các tính năng tồn tại chỉ trong một vỏ.


10
Làm thế nào là các tính năng duy nhất cho một hoặc chủ quan khác? Tôi thực sự không tìm kiếm một con sáo và tiến hành sự quen thuộc của người này hay người kia có thể là một lý do tốt để thích cái vỏ đó.
Tim

Câu trả lời:


40

zsh là dành cho người thô tục. ;-)

Nghiêm túc: bash 4.0 có một số tính năng trước đây chỉ được tìm thấy trong zsh, như ** globalbing:

% ls /usr/src/**/Makefile

tương đương với:

% find /usr/src -name "Makefile"

nhưng rõ ràng mạnh hơn.

Theo kinh nghiệm của tôi, việc hoàn thành lập trình của bash thực hiện tốt hơn một chút so với zsh, ít nhất là đối với một số trường hợp (ví dụ hoàn thành các gói debian cho năng khiếu).

bash Alt + .phải chèn!$

zsh has expansion of all variables, so you can use e.g.

% rm !$<Tab>

for this. zsh can also expand a command in backtics, so

% cat `echo blubb | sed 's/u/a/'`<Tab>

yields

% cat blabb

I find it very useful to expand rm *, as you can see what would be removed and can maybe remove one or two files from the commmand to prevent them from being deleted.

Also nice: using the output from commands for other commands that do not read from stdin but expect a filename:

% diff <(sort foo) <(sort bar)

From what I read bash-completion also supports completing remote filenames over ssh if you use ssh-agent, which used to be a good reason to switch to zsh.

Aliases in zsh can be defined to work on the whole line instead of just at the beginning:

% alias -g ...="../.."
% cd ...

8
Trong bash, C-M-eđể "vỏ mở rộng dòng", mà sẽ mở rộng cat `echo blubb | sed 's/u/a/'` tới cat blabbecho $SHELLđể echo /bin/bashtrong trường hợp của tôi. Ngoài ra, C-x *để "toàn cầu mở rộng từ", sẽ mở rộng rm *.
Victor

16

Tôi muốn chỉ ra rằng bash không được cài đặt theo mặc định trên FreeBSD, OpenBSD hoặc NetBSD và nó cũng không được cài đặt theo mặc định trên Solaris 10 (OpenSolaris có mặc định), lần trước tôi đã sử dụng AIX và Máy chủ HP-UX không được cài đặt theo mặc định.

Ngoài ra, trên OpenSolaris / bin / sh KHÔNG phải là bash. Đó là ksh. Vấn đề lớn nhất mà tôi có với tư cách là người khuân vác phần mềm là những người cho rằng / bin / sh là bash và nó sẽ chấp nhận cú pháp mở rộng bash. Mặc dù điều này dường như là trường hợp trên hầu hết các bản phân phối Linux, nhưng nó không phải là trường hợp khác và nó thực sự gây phiền nhiễu.


6
Có bạn đúng. Than ôi, tất cả các nhà cung cấp này chắc chắn làm cho nó rất dễ dàng để cài đặt bash như một gói bổ sung. +1 để chỉ ra sự cần thiết cho / bin / sh purism trong các tập lệnh.
kubanchot

@kubanchot: Nếu bạn đang làm việc trên các máy mà bạn không có quyền truy cập root, thì có thể không dễ cài đặt, vì vậy tôi nghĩ rằng quan điểm của X-Istence. (Tôi làm việc với một loạt các hộp Solaris và các sysadins đều là rác ksh. Lần trước tôi đã cố gắng biên dịch phần mềm của riêng mình mà tôi không thể sống mà không có (git trong trường hợp này) có thiếu sót với trình biên dịch đã cài đặt, vì vậy thậm chí tuyến đường đó đã bị cắt đứt với tôi.)
iconoclast

12

Mặc dù tôi là người dùng bash, tôi thấy một trong những tính năng của zsh khá thú vị: RPS1.

Nhớ lại:

  • PS1: dấu nhắc căn lề trái
  • RPS1: dấu nhắc căn phải

Mẫu vật:

Khi sử dụng một cái gì đó như

PS1=’%B(%h) %m%#%b 
RPS1=’(%20<…<%~)'

Bạn nhận được lời nhắc ở bên trái và thư mục hiện tại được đẩy sang phải. Nó thậm chí biến mất khi dòng hiện tại đang trở nên quá dài! Đó là vì zsh đủ thông minh để ưu tiên thấp cho RPS1.

Bạn có thể xem ảnh chụp màn hình của ví dụ này tại http://imgur.com/OAZhC .


9

Zsh đã sửa lỗi chính tả. Nếu bạn là một lá thư (hoặc nhiều hơn), nó sẽ tìm ra ý của bạn.

Nó cũng có hoàn thành tab mạnh mẽ hơn, mà tôi thích.

Zsh có một tiện ích cấu hình tương tác để thiết lập nó theo cách bạn muốn.

Một số bài kiểm tra tốc độ cho biết zsh nhanh hơn, nhưng tôi không nhận thấy sự khác biệt nào.


1
Một phiên bản rút gọn của dấu gạch ngang chỉ hỗ trợ một tập hợp con các tính năng của nó và được thiết kế để được sử dụng trong các tập lệnh chạy nhanh (ví dụ: phần khởi động) là dấu gạch ngang.
Chucky

zshthậm chí có một cài đặt để cho phép sử dụng sai số 'một chữ cái' cho việc sử dụng bàn phím Dvorak.
vgoff

6

Tôi không biết bất kỳ tính năng bash nào mà zsh không hỗ trợ. Mục tiêu thiết kế của zsh dường như bao gồm hỗ trợ bất kỳ tính năng nào mà bash thêm vào.

Tôi vẫn sử dụng bash thay vì zsh. Tôi hiếm khi bắt gặp các tính năng hấp dẫn mà zsh hỗ trợ mà bash không có. Các vấn đề thỉnh thoảng với zsh trong những năm qua, hoặc nó không tồn tại trên một số hệ thống nhất định, đã làm cho nó không có giá trị thực hiện quá trình chuyển đổi.

Cuối cùng tôi cũng có thể sử dụng cùng một hệ vỏ trên mọi hệ thống Unix, không đáng để phá vỡ điều này cho các tính năng tôi sẽ không bao giờ sử dụng.

Các tính năng hiện diện trong zsh không có trong bash dường như dễ thương nhưng không phải là những tính năng quan trọng hàng ngày.


3

bash có nhiều tính năng chỉ được sử dụng trong zsh. Bạn có thể có 'hoàn thành tab thông minh' với bash aswell ngay bây giờ, như bất kỳ người dùng ub Ubuntu nào gần đây đã phát hiện ra.


1

Thay thế quá trình và mở rộng toàn cầu là hai tính năng tôi sẽ bỏ lỡ nhiều nhất. Các cài đặt lời nhắc cũng khá tuyệt - nhìn thấy mức độ lồng nhau khi bạn đang gõ các câu lệnh phức tạp trên các dòng lệnh. Tự động tải làm cho bao gồm rất nhiều chức năng trong mọi vỏ khả thi.


Tôi giả sử bạn có nghĩa là bạn sẽ bỏ lỡ những thứ đó từ zsh, vì AFAIK mọi thứ bạn đề cập đều có trong zsh? (Nhưng bạn có chắc là tất cả họ đều vắng mặt trong bash không? Điều đó sẽ làm tôi ngạc nhiên.) Ngoài ra, sẽ rất hữu ích nếu bạn đưa ra ví dụ về cách mỗi tính năng đó làm cho tuổi thọ vỏ của bạn dễ dàng hơn.
iconoclast

0

Tôi là một fan hâm mộ của zsh vì hỗ trợ chế độ vi, nhưng tôi phát hiện ra rằng nó không được sử dụng rộng rãi. Tôi nghĩ rằng tôi đã đọc rằng zsh thích lấy các tính năng phổ biến từ các shell khác và kết hợp chúng (vì vậy những thứ cụ thể cho bash và những thứ cụ thể cho csh đều có sẵn trong zsh).

Ai đó cũng nói rằng tôi uốn cong yếu tố đam mê của mình bằng cách sử dụng zsh, nhưng tôi không thể xác nhận hoặc phủ nhận tin đồn đó.


5
và có, bash cũng có hỗ trợ vi-mode.
pjz

@Milner: bạn có thể giải thích loại hỗ trợ chế độ vi nào trong zsh không có trong bash không? Nếu bạn chỉ đơn giản là khả năng thực hiện thiết lập -o vi trên dòng lệnh, thì đó rõ ràng là cả hai. Nếu có một số hỗ trợ mở rộng trong zsh, bạn có thể mô tả rõ ràng nó là gì và nó thêm gì không?
iconoclast

-1

Mức độ phổ biến, #bash 430 người dùng. #zsh 123 người dùng. Tôi tin rằng trang web zsh có một so sánh tốt về zsh với các shell khác. zsh có hỗ trợ chế độ vi tốt hơn.


2
Làm thế nào là chế độ vi trong zsh tốt hơn? Tôi là người dùng bash và tôi có chế độ vi, vì vậy tôi muốn biết liệu có lợi ích gì khi chuyển đổi không.
ptman

1
@ptman: Dấu nhắc của zsh có thể được thực hiện để báo cho chế độ (chèn / bình thường). Readline không thể làm điều đó. Lời nhắc cũng linh hoạt hơn: bạn có thể đánh dấu cú pháp, v.v.!
unperson325680 17/03/2016

@progo: à! rất đẹp. Bây giờ tôi chỉ có thể bắt đầu sử dụng chế độ vi trong zsh. Đó là một trong những lý do khiến tôi gắn bó với chế độ emacs cho đến nay.
iconoclast

@Brandon rằng sự tăng cường nhỏ là lý do để tôi chuyển đổi vỏ.
unperson325680

-1

Bash đang sử dụng cùng một cú pháp cho if và while vì điều đó có thể được sử dụng trong các tập lệnh / bin / sh trên dòng lệnh.
Trong zsh cú pháp là khác nhau. Hiệu quả khi sử dụng zsh, bạn phải nhớ cả hai, nếu bạn đang sử dụng câu lệnh if- hoặc while trên dòng lệnh của mình


1
Tôi đã thử điều này, sử dụng if [[ $test = "test" ]]; then echo "success"; else echo "failure"; fitrên cả dòng lệnh và tập lệnh, và nó hoạt động như mong đợi trong cả hai trường hợp. Vì vậy, có vẻ như bạn không có sự thật của bạn.
iconoclast

Điều này phụ thuộc vào những gì bạn đã cài đặt là / bin / sh. Nếu / bin / sh là bash, thì bạn đã đúng. Mặt khác, bash không có lợi thế này. Nếu zsh là / bin / sh, zsh có lợi thế này. Với tất cả các shell khác nhau có thể cung cấp / bin / sh, cá nhân tôi khuyên bạn chỉ nên sử dụng shell mà bạn muốn cho kịch bản shell, để sự vắng mặt của nó chỉ ra một vấn đề với một sửa chữa rõ ràng, thay vì các hành vi kỳ quái không có manh mối về cách giải quyết.
Ed Grimm
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.