Những tính năng nào trong zsh và thiếu từ bash, hoặc ngược lại?


62

Là người dùng Linux, tôi luôn sử dụng bash vì nó là mặc định trên mọi bản phân phối tôi sử dụng. Những người sử dụng các hệ thống Unix khác như BSD dường như sử dụng các shell khác thường xuyên hơn. Để tìm hiểu thêm một chút, tôi đã quyết định thử zsh.

Là người dùng bash:

  • Tôi sẽ bỏ lỡ những tính năng nào?
  • Và những gì tôi nên tìm ra?


5
@Gilles một ngày nào đó có thể tốt đẹp khi có tất cả những người chuyển đến đây ... và sáp nhập
xenoterracide

Câu trả lời:


45

Đã có khá nhiều hoạt động về chủ đề này trên các trang web Stack Exchange khác. Kinh nghiệm của tôi về việc chuyển đổi từ bash sang zsh, theo như tôi có thể nhớ (đó là những năm trước²), là tôi đã không bỏ lỡ một điều gì. Tôi đã đạt được rất nhiều; Đây là những gì tôi nghĩ là các tính năng cụ thể của zsh đơn giản mà tôi sử dụng nhiều nhất:

  • Tính năng zsh mà tôi nhớ nhất khi thỉnh thoảng sử dụng bash là autocd: trong zsh, thực thi một thư mục có nghĩa là thay đổi nó, miễn là bạn bật autocdtùy chọn.⁴

  • Một tính năng rất hữu ích khác là hình cầu lạ mắt. Các ký tự chữ tượng hình hơi khó nhớ nhưng cực kỳ tiện lợi (như trong, việc tìm kiếm chúng thường nhanh hơn so với viết findlệnh tương đương ). Một vài trong số những ví dụ đơn giản:
        foo*~*.bak= tất cả các trận đấu cho foo*trừ những khớp *.bak
        foo*(.)= chỉ file thường xuyên phù hợp với foo*
        foo*(/)= chỉ thư mục phù hợp foo*
        foo*(-@)= chỉ treo lủng lẳng liên kết tượng trưng phù hợp foo*
        foo*(om[1,10])= 10 file mới nhất phù hợp với foo*
        foo*(Lm+1)= chỉ file kích thước> 1MB = trong thư mục và tất cả của nó thư mục con, đệ quy⁴
        dir/**/foo*foo*dir

  • Đối với đổi tên ưa thích, zmvnội dung có thể được tiện dụng. Ví dụ: để sao chép mọi filevào file.bak:zmv -C '(*)(#q.)' '$1.bak'

  • Cả bash và zsh đều có một hệ thống hoàn thành tốt cần được bật rõ ràng ( . /etc/bash_completionhoặc autoload -U compinit; compinit). Zsh là cấu hình nhiều hơn và thường là fancier.

Nếu bạn chạy zsh mà không có a .zshrc, nó sẽ bắt đầu một menu tương tác cho phép bạn chọn các tùy chọn cấu hình. (Một số các bản phân phối có thể vô hiệu hóa này; trong trường hợp đó, hãy chạy autoload zsh-newuser-install; zsh-newuser-install.) Tôi khuyên bạn nên tạo điều kiện cho các tùy chọn lịch sử đề nghị, bật ( “kiểu mới”) hoàn thành, và bật “Tùy chọn vỏ chung” trừ beep. Sau đó, cấu hình nhiều tùy chọn hơn khi bạn khám phá chúng.

² Tại thời điểm hoàn thành lập trình là tính năng sát thủ của zsh, nhưng bash đã có được nó ngay sau đó.
Các tính năng bash mua chỉ trong phiên bản 4 (vì vậy vẫn không có sẵn trên nhiều hệ thống) là trong loại nhỏ hơn.


5
Bash 4.0 hiện hỗ trợ autocdtính năng bạn thảo luận ở trên. Kích hoạt tính năng bằng lệnh shopt -s autocd. Sau đó, tính năng hoạt động như bạn đã mô tả.
Philluminati

zsh cũng có wherelệnh tích hợp, không bị nhầm lẫn với whichlệnh.
Sildoreth

@EdGrimm Tôi nghĩ GNU và FreeBSD tìm có thể làm mọi thứ vòng loại glob zsh có thể làm (với -execmột vỏ cho những thứ như lựa chọn với evà một đường ống dẫn vào các công cụ như sortsedcho viết lại với evà phân loại). Tất nhiên hơn rất nhiều bằng lời nói.
Gilles 'SO- ngừng trở nên xấu xa'

Sau khi kiểm tra và kiểm tra lại trang tìm kiếm trong hơn một thập kỷ, tôi đoán rằng tôi đã ngừng tìm kiếm. Nhưng nếu tôi đã kiểm tra lần cuối trước khi bình luận, ít nhất tôi đã thấy tùy chọn kích cỡ bây giờ sẽ giảm đơn vị xuống byte.
Ed Grimm

11

Ngoài ra, việc hoàn thành tab mặc định tốt hơn bash ... ví dụ ...

~/.e.dTAB sẽ mở rộng sang ~/.emacs.d/zsh, bash sẽ chỉ là tiếng bíp.


nó đã không setoptbạn sử dụng tùy chọn không mặc định nào cho điều đó (nếu có)?

Tôi nhận ra rằng tôi đã _-.thiết lập như một ký tự đại diện. zstyle ':completion:*' matcher-list 'm:{a-zA-Z}={A-Za-z}' 'r:|[._-]=* r:|=*' 'l:|=* r:|=*' . Xem stackoverflow.com/q/7906078/311660
ocodo

10

zshcho phép bạn chỉnh sửa lệnh nhiều dòng (xem trình chỉnh sửa dòng zsh ), bash không. Nếu bạn thử cùng một mẹo ( Ctrl-p), bash sẽ tìm nạp lệnh cuối cùng.


2
Bash thực hiện điều này, ít nhất là từ phiên bản 4.2.37; nó thay thế các dòng mới bằng dấu chấm phẩy và cung cấp cho bạn một dòng duy nhất để chỉnh sửa.
Keith Thompson

1
Vẫn không đẹp bằng. (:
SilverWolf

8

Bash có tính năng có thể mở các cổng bằng cách sử dụng

/dev/tcp/host/port

hoặc là

/dev/udp/host/port

Tuy nhiên, nó bị vô hiệu hóa trong Debian vì nó được coi là một trở ngại (nếu đường dẫn thực sự tồn tại) và nằm ngoài phạm vi của một trình bao nên làm. Thêm thông tin [danh sách gửi thư debian]


5
zsh có nội dung dựng sẵn ztcp mặc dù có nhiều khả năng hơn bash's / dev / tcp, không có / dev / udp. Tôi thà sử dụng socat mặc dù.
Stéphane Chazelas

2

Mà - tăng cường trong zsh

Các whichlệnh trong bash chỉ tiết lộ vị trí của một lệnh.

Trong Zsh whichsẽ tiết lộ định nghĩa của an alias, nguồn cho a functionvà vị trí của lệnh.

Hãy nói rằng chúng tôi đã có một bí danh vỏ:

alias gg='git log'

Trong Bash nếu chúng tôi hỏi: which ggkết quả sẽ bị hủy

Trong Zsh: which ggsẽ cho chúng tôi ...

gg: aliased to git log

Giả sử chúng ta có một hàm shell:

hello() {
    echo "Hello World"
}

Trong Bash nếu chúng tôi hỏi: which hellokết quả sẽ là void.

Trong Zsh: which hellosẽ cho chúng tôi ...

hello() {
    echo "Hello World"
}

Bash cung cấp chức năng tương tự thông qua lệnh type(dựng sẵn). Và chỉ với nitpick: whichlà một lệnh bên ngoài, không phải là bash dựng sẵn.
Torkel Bjørnson-Langen


0

zsh - một vỏ hoàn chỉnh

có rất nhiều, đọc qua zshcontrib(1)người ta có thể phát hiện hai phiên bản của autoload-able tetristrò chơi (khác với ncurses) trong zshcạnh tranh với emacs, cho đầy đủ (như mô tả).

= =

Tôi muốn đề cập đến =từ khóa, có thể gây khó chịu với curl(URL thường có ?var=valtrong đó; nhưng unsetopttôi nghĩ là có thể):

  • q file =less( gentoo) giải quyếtq file $(which less)

= mở rộng đến đường dẫn đầy đủ của lệnh trong câu hỏi.

những điều tốt đẹp khác

những thứ khác, ngoài ý nghĩ, là dấu nhắc đúng RPS1=%d(để hiển thị $PWDtheo kiểu), Alt + H( run-helptức là man), Alt + ? ( which-command) vared, và zed( autoloadchức năng), xe buýt nhỏ giống như của Emacs Alt + Xđể thực thi các widget mà không ràng buộc chúng, bí danh toàn cầu và hậu tố, mở rộng theo dõi lịch sử thời gian hoàn thành lệnh, -m-regexquẹt, thi đua vỏ (ví dụ. csh, kshvới emulate) và autoload run-helpvới đoạn tập tin cho các built-in.

lời than thở

Tôi nghĩ rằng hầu hết, nếu không phải tất cả, các tính năng đã được triển khai từ lâu và đọc qua các thay đổi, không có thay đổi lớn và bổ sung tính năng mới, điều này rất buồn (không có gì để khám phá và khám phá nữa).

bashdường như được hơn phân phối trong readline(như trái ngược với zle) và gnu historytheo tinh thần linux; ví dụ: các hàm readline và keybindings có thể được áp dụng trên toàn cầu (như được giữ trong ~/.inputrc/etc/inputrc) nếu không bị quá tải bởi bash-cụ thể bind.

phần kết luận

Cá nhân tôi nghĩ emacs(đặc biệt từ triển vọng của (hiện tại?) emacs-nox) Là nguồn cảm hứng cho phần mềm đặc biệt như zshtmuxđã làm rất tốt trong việc trở thành một ví dụ trong việc triển khai như vậy; cho những người đánh giá cao giá trị của nó (đến mức không cần / phụ thuộc vào Xmáy chủ). Vỏ Unix đủ mạnh, và tính liên tục và nhất quán của nó đủ cho một quy trình làm việc và năng suất phù hợp (trong điện toán tổng thể).

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.