Lấy một gợi ý từ Autotools: bám vào mẫu số chung thấp nhất của vỏ Bourne và POSIX - có thể được tăng cường bởi sed
- nếu bạn phải viết một cái gì đó phải hoạt động ở mọi nơi . Có thể tồn tại các hệ thống trong đó một cái gì đó bị phá vỡ, nhưng bạn có thể giải quyết các vấn đề như vậy bằng cách viết lại.
Ví dụ: một số hệ thống cổ có vấn đề với lỗi mở rộng test
, hay còn gọi là [
:
if [ $foo = bar ] ; then...
Vì vậy , thực hành Autoconf là viết lại nó trong dấu ngoặc kép với một tiền tố ký tự duy nhất, như vậy:
if [ x"$foo" = "xbar" ] ; then...
Bạn cũng có thể sử dụng "x$foo"
ở đây. Điều này bảo vệ chống lại khả năng $foo
có thể là một lựa chọn hợp lệ test(1)
, và vì [
là bí danh cho test
, nó có thể giải thích sai biểu thức. Giải pháp là thiết lập một tình huống trong đó đối số không xác định [
luôn bắt đầu bằng x
, có nghĩa là nó không thể có ý nghĩa đặc biệt [
.
(Autoconf cũng khuyên bạn nên sử dụng test
thay vì [
, nhưng lời khuyên đó xuất hiện như một phản ứng đối với các xung đột có thể xảy ra với M4 , cũng sử dụng [
cú pháp của nó.)
awk là POSIX , vì vậy về mặt lý thuyết nó có sẵn ở mọi nơi. Nó thậm chí còn trong Busybox , vì vậy bạn sẽ có một awk
triển khai ngay cả trong một số hệ thống nhúng nhúng rất hạn chế. Tuy nhiên, tôi muốn được ít ngạc nhiên khi đi qua một hệ thống mà không awk
hơn sed
. Tôi cho rằng nó đi xuống sự phức tạp: các công cụ đơn giản có nhiều khả năng sống sót hơn trong việc phân chia tích cực.
Perl không phải là một phần của bất kỳ tiêu chuẩn phổ biến rộng rãi nào, POSIX hay nói cách khác, vì vậy bạn chỉ đơn giản là không thể tin tưởng vào nó nếu bạn không biết gì về môi trường mục tiêu. Perl không được cài đặt theo mặc định trong:
- Cygwin
- FreeBSD và NetBSD
- Cài đặt "tối thiểu" cho một số Linux, bao gồm cả Slackware
- nhiều Linux nhúng dựa chủ yếu vào Busybox cho vùng người dùng của họ
Hướng dẫn Autoconf có một chương về lập trình shell di động sẽ hữu ích cho bạn. Các công cụ phần cuối bìa thích sed
, awk
và nhiều người khác.