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 đ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?
Câu trả lời:
Nếu tập lệnh của bạn bắt đầu với dòng, #!/bin/bash
chú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.
.zshrc
:)
#!/bin/bash
sẽ bị bỏ qua nếu chạy tập tin script như thế source ./script.sh
nào?
#!/usr/bin/env bash
Thay 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.
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 sh
hoặ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 .bashrc
thà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ọ .bashrc
hoặc .zshrc
bạ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 sh
thay 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.
./my_script.sh
. source my_script.sh
và . my_script.sh
sẽ chạy nó như là vỏ hiện tại, bỏ qua bất kỳ shebang.
Nếu shebang là #!/bin/bash
và bạn bắt đầu tập lệnh ./script
thì 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 ./script
hoặc nguồn nó . ./script
và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 prompt
trong 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 đề:
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 -- *(/)
) .Con zsh:
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.