Tất cả các biến thể của ngôn ngữ shell Bourne là khách quan khủng khiếp so với các ngôn ngữ kịch bản hiện đại như Perl, Python, Ruby, node.js và thậm chí (có thể nói là) Tcl. Nếu bạn phải làm bất cứ điều gì thậm chí hơi phức tạp một chút, bạn sẽ hạnh phúc hơn về lâu dài nếu bạn sử dụng một trong những điều trên thay vì một kịch bản shell.
Ưu điểm duy nhất và duy nhất mà ngôn ngữ shell vẫn có trên các ngôn ngữ mới hơn đó là thứ gì đó tự gọi /bin/sh
là được đảm bảo tồn tại trên bất kỳ thứ gì có ý nghĩa là Unix. Tuy nhiên, thứ gì đó thậm chí có thể không tuân thủ POSIX; nhiều Unix độc quyền kế thừa đã đóng băng ngôn ngữ được triển khai bởi /bin/sh
và các tiện ích trong PATH mặc định trước những thay đổi mà Unix95 yêu cầu (vâng, Unix95, hai mươi năm trước và đang tính). Có thể có một bộ Unix95 hoặc thậm chí POSIX.1-2001 nếu bạn may mắn, các công cụ trong một thư mục không có trên PATH mặc định (ví dụ /usr/xpg4/bin
) nhưng chúng không được bảo đảm tồn tại.
Tuy nhiên, những điều cơ bản của Perl có nhiều khả năng có mặt trên bản cài đặt Unix được chọn tùy ý so với Bash. (Theo "những điều cơ bản của Perl", ý tôi là /usr/bin/perl
tồn tại và là một số , có thể khá cũ, phiên bản của Perl 5, và nếu bạn may mắn, bộ mô-đun đi kèm với phiên bản phiên dịch đó cũng có sẵn.)
Vì thế:
Nếu bạn đang viết một cái gì đó phải hoạt động ở mọi nơi có nghĩa là Unix (chẳng hạn như tập lệnh "configure"), bạn cần sử dụng #! /bin/sh
và bạn không cần sử dụng bất kỳ tiện ích mở rộng nào. Ngày nay tôi sẽ viết vỏ tương thích POSIX.1-2001 trong trường hợp này, nhưng tôi sẽ sẵn sàng vá lỗi POSIXism nếu có ai đó yêu cầu hỗ trợ cho sắt gỉ.
Nhưng nếu bạn không viết một cái gì đó phải hoạt động ở mọi nơi, thì ngay lúc đó bạn muốn sử dụng bất kỳ Bashism nào, bạn nên dừng lại và viết lại toàn bộ bằng một ngôn ngữ kịch bản tốt hơn. Tương lai của bạn sẽ cảm ơn bạn.
(Vì vậy, khi được nó thích hợp để sử dụng phần mở rộng Bash Để đặt hàng đầu tiên: không bao giờ Để trật tự thứ hai: chỉ để mở rộng môi trường tương tác Bash - ví dụ để cung cấp bằng tab hoàn thành và lạ mắt nhắc nhở thông minh?..)
#!/bin/sh
và không sử dụng bất cứ thứ gì khác ngoài những gì vỏ ban đầu được cung cấp.