Có phải tất cả các tập lệnh bash đều tương thích với `zsh`?


63

Tôi đang tìm cách chuyển từ bash sang zsh nhưng lo ngại về tính tương thích của các tập lệnh bash.

Có phải tất cả các tập lệnh / hàm bash đều tương thích với zsh? Vì vậy, nếu đó là sự thật thì zsh chỉ là một sự tăng cường cho bash?


Tôi thấy điều này hữu ích: Askubfox.com/questions/1577/moving-from-bash-to-zsh
chrisjlee

Câu trả lời:


55

Nếu tập lệnh của bạn bắt đầu với dòng, #!/bin/bashchúng vẫn sẽ được chạy bằng bash, ngay cả khi shell mặc định của bạn là zsh.

Tôi đã tìm thấy cú pháp của zsh thực sự gần với một cú bash và tôi đã không chú ý nếu thực sự có một số điểm không tương thích. Tôi đã chuyển đổi 6 năm trước từ bash sang zsh liền mạch.


1
Phần khó khăn nhất của bạn khi chuyển đổi là gì?
chrisjlee

4
Không ai. Các tập lệnh cá nhân của tôi thêm tham chiếu thích hợp vào bash và tôi đã tìm thấy một .zshrc tốt để bắt đầu. Zsh và bash đủ giống nhau đến nỗi tôi không thực sự thấy nó thách thức.
Huygens

4
bạn có thể liệt kê của bạn .zshrc:)
neaumusic

Nhưng nếu dòng #!/bin/bashsẽ bị bỏ qua nếu chạy tập tin script như thế source ./script.shnào?
LCB

3
Mã hóa cứng đường dẫn đến vỏ là lời khuyên tồi, ngay cả khi nó được thực hiện thường xuyên. #!/usr/bin/env bashThay vào đó, bạn nên sử dụng , đặc biệt là trên macOS, trong đó bash mặc định đã lỗi thời nghiêm trọng và các phiên bản mới hầu như luôn được cài đặt vào một đường dẫn khác.
Konrad Rudolph

29

Zsh có thể chạy hầu hết các tập lệnh Bourne, POSIX hoặc ksh88 nếu bạn đặt nó ở chế độ mô phỏng ( emulate shhoặc emulate ksh) phù hợp. Nó không hỗ trợ tất cả các tính năng của bash hoặc ksh93. Zsh có hầu hết các tính năng của bash, nhưng trong nhiều trường hợp với một cú pháp khác nhau.

Shell bạn sử dụng tương tác là không liên quan cho bất kỳ tập lệnh nào bạn có. Shell chạy các script là cái được chỉ định trong dòng đầu tiên, dòng shebang . Ví dụ, nếu tập lệnh bắt đầu bằng #!/bin/bash, nó sẽ được thực thi bằng bash.

Nếu bạn đã tùy chỉnh bash, bạn sẽ không thể đổi tên .bashrcthành .zshrc. Một số thứ có thể được chia sẻ, ví dụ như bí danh và hàm, miễn là bạn dính vào giao điểm giữa hai shell (giao điểm gần với ksh88 và pdksh ). Những thứ khác, chẳng hạn như cài đặt nhanh chóng, chức năng hoàn thành và hầu hết các tùy chọn, sẽ cần phải được viết lại hoàn toàn.

Nếu bạn đang viết một đoạn trích để mọi người lấy nguồn từ họ .bashrchoặc .zshrcbạn không muốn duy trì hai phiên bản, hãy sử dụng một tập hợp con phổ biến của các tính năng bash và zsh, bao gồm hầu hết các tính năng lập trình của bash. Đặt toàn bộ mã của bạn vào các hàm và đặt dòng sau ở đầu mỗi hàm:

if [ -n "$ZSH_VERSION" ]; then emulate -L ksh; fi

Bạn có thể sử dụng emulate shthay vì emulate kshđể gần hơn với cú pháp sh đơn giản, đó là những gì bạn cần .profile.

Nếu một hàm gọi một hàm khác, thì hàm kia sẽ kế thừa cài đặt mô phỏng, do đó bạn không cần đặt dòng này trong các hàm bên trong, chỉ trong các hàm được gọi bởi người dùng cuối.


1
Shell bạn sử dụng là không liên quan nếu bạn chạy tập lệnh của bạn như ./my_script.sh. source my_script.sh. my_script.shsẽ chạy nó như là vỏ hiện tại, bỏ qua bất kỳ shebang.
BallpointBen

3

Nếu shebang là #!/bin/bashvà bạn bắt đầu tập lệnh ./scriptthì tập lệnh sẽ được thực thi bằng bash. Hoàn toàn không có vấn đề ở đây.

Tuy nhiên, nếu bạn thực thi zsh ./scripthoặc nguồn nó . ./scriptvào đối tượng zsh đang chạy, điều khá phổ biến là cú pháp của bash và zsh sẽ không khớp.

Ví dụ, zsh không mở rộng tham số không chia theo mặc định, bash có một sự giúp đỡ dựng sẵn, không có read -p prompttrong zsh (cú pháp là rất khác nhau đọc cmd \? Nhắc , arrays start on 1 (not 0) in zsh,lệnh only search for external commands in zsh, or there is no (simple) equivalent to$ {foo ^} `(chữ hoa chỉ ký tự đầu tiên) trong zsh Đây là một danh sách dài các điểm tương đồng (chủ yếu) và một số khác biệt .

Trong một số trường hợp, zsh có thể được yêu cầu mô phỏng các shell khác. Trong một số trường hợp, không có cú pháp chung di động cho cả hai shell có thể (không sử dụng bí danh hoặc hàm để mô phỏng các giải pháp di động).

Tuy nhiên, zsh có nhiều (rất nhiều) tiện ích mở rộng giúp dễ dàng làm việc tương tác hơn. Đó đồng thời là một lý do tuyệt vời để chuyển đổi và một vấn đề:

  1. Pro zsh

    • Thật tuyệt khi có thể thấy các tùy chọn cú pháp lệnh nhấn một tab.
    • Một lợi ích lớn khác của zsh là sửa lỗi khi bạn mắc lỗi đánh máy. Thay vì chỉ hiển thị lỗi: không tìm thấy lệnh, zsh sẽ cố gắng diễn giải những gì bạn đã cố gắng nhập. zsh sẽ chấp nhận đầu vào này là một lệnh hợp lệ.
    • Ngoài ra, zsh có nhiều sửa đổi để mở rộng cho phép một loạt các giải pháp. Like: liệt kê các tập tin: ls *(.)(khó khăn với các shell khác). Ngay cả khi nhìn đủ sâu, câu trả lời cũng trở nên phức tạp trong zsh ( print -rl -- *(/)) .
    • Chấp nhận toán học với phao (với một số hãy cẩn thận).
  2. Con zsh:

    • Bash là shell mặc định trong nhiều hệ thống hơn.
    • Nhiều tùy chọn zsh không giúp trực tiếp viết các tập lệnh tương thích bash.
    • Nó thậm chí có thể trở thành một vấn đề lớn khi cố gắng học hai vỏ cùng một lúc.

Cuối cùng, đó là sự lựa chọn của bạn, và, tôi luôn thích nhiều sự lựa chọn hơn.

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.