Bạn chỉ nên sử dụng #! /bin/sh
.
Bạn không nên sử dụng các tiện ích mở rộng bash (hoặc zsh hoặc fish hoặc ...) trong tập lệnh shell.
Bạn chỉ nên viết các kịch bản shell hoạt động với bất kỳ triển khai ngôn ngữ shell nào (bao gồm tất cả các chương trình "tiện ích" đi cùng với chính shell). Ngày nay, bạn có thể lấy POSIX.1-2001 ( không phải -2008) làm thẩm quyền cho những gì trình bao và tiện ích có khả năng, nhưng lưu ý rằng một ngày nào đó bạn có thể được yêu cầu chuyển tập lệnh của mình sang hệ thống cũ (ví dụ Solaris hoặc AIX) có vỏ và các tiện ích bị đóng băng vào khoảng năm 1992.
Cái gì, nghiêm túc?!
Vâng, rất nghiêm trọng.
Đây là điều: Shell là một ngôn ngữ lập trình khủng khiếp . Điều duy nhất nó có cho nó là /bin/sh
trình thông dịch kịch bản một và duy nhất mà mọi cài đặt Unix được đảm bảo có.
Đây là một điều khác: một số lần lặp của trình thông dịch Perl 5 lõi ( /usr/bin/perl
) có nhiều khả năng sẽ có sẵn trên bản cài đặt Unix được chọn ngẫu nhiên hơn (/(usr|opt)(/(local|sfw|pkg)?)?/bin/bash
là. Các ngôn ngữ kịch bản tốt khác (Python, Ruby, node.js, v.v. - Tôi thậm chí sẽ bao gồm PHP và Tcl trong danh mục đó khi so sánh với shell) cũng gần như có sẵn như bash và các shell mở rộng khác.
Do đó, nếu bạn có tùy chọn viết tập lệnh bash , thay vào đó , bạn có tùy chọn sử dụng ngôn ngữ lập trình không tệ.
Bây giờ, các tập lệnh shell đơn giản , loại chỉ chạy một vài chương trình theo trình tự từ công việc định kỳ hoặc một cái gì đó, không có gì sai khi để chúng làm tập lệnh shell. Nhưng các kịch bản shell đơn giản không cần mảng hoặc hàm hoặc [[
thậm chí. Và bạn chỉ nên viết các kịch bản shell phức tạp khi bạn không có lựa chọn nào khác. Ví dụ, các kịch bản Autoconf là các kịch bản lệnh shell. Nhưng các tập lệnh đó phải chạy trên mọi hiện thân /bin/sh
có liên quan đến chương trình được cấu hình. và điều đó có nghĩa là họ không thể sử dụng bất kỳ tiện ích mở rộng nào. Bạn có thể không cần quan tâm đến các Unix độc quyền cũ ngày nay, nhưng có lẽ bạn nên quan tâm đến các BSD nguồn mở hiện tại, một số trong đó không cài đặtbash
theo mặc định và các môi trường nhúng chỉ cung cấp cho bạn một vỏ tối thiểu và busybox
.
Tóm lại, thời điểm bạn thấy mình muốn một tính năng không có sẵn trong ngôn ngữ shell di động, đó là dấu hiệu cho thấy tập lệnh đã trở nên quá phức tạp để giữ nguyên tập lệnh shell. Thay vào đó hãy viết lại bằng ngôn ngữ tốt hơn.
bash
hàm và cú pháp thay vì cácsh
hàm và cú pháp.