Những gì không phải là vỏ cụ thể?


9

Trong một số câu trả lời, tôi thấy các bình luận khuyên bạn nên tránh các lệnh cụ thể trong câu trả lời.

Làm thế nào để tôi biết các lệnh, toán tử, vv tồn tại trong tất cả các shell? Có một danh sách các tiêu chuẩn?

  • man builtinsđưa ra một danh sách các lệnh. Đây có phải là những lệnh duy nhất mà tôi có thể sử dụng trong tập lệnh shell di động hoạt động trong tất cả các shell không?
  • Một tích hợp có thể được cụ thể vỏ?
  • Các tiêu chuẩn cho Linux có khác với các Unix khác không?
  • Thế còn cú pháp? Có thể chấm câu, toán tử, vv trong một số shell?

Câu trả lời:


12

Wiki của Greg có một bài viết về việc điều chỉnh các tập lệnh bash cho Dash chỉ ra rất nhiều 'bashism' - các tính năng bổ sung không chuẩn nhưng là một phần của bash. Tránh những bashism đó có thể giúp làm cho kịch bản của bạn thân thiện hơn với các môi trường khác nhau. Điều này đặc biệt trả lời một số câu hỏi của bạn. Ví dụ, có, có các toán tử khác nhau (như ==), nhưng có một bộ Posix tiêu chuẩn sẽ hoạt động trong tất cả các môi trường.

Để đọc kỹ hơn, bạn có thể kiểm tra tiêu chuẩn Posix , tất cả các vỏ phải tuân thủ. Đặc biệt, âm lượng trên "Shell & Utility".

Điều tôi thấy khó khăn hơn sự khác biệt về vỏ là sự khác biệt về lệnh. Nhiều hệ thống Linux có GNU find, nhưng nếu bạn đang viết một tập lệnh di động, đừng dựa vào chính bạn man find, bởi vì có rất nhiều hệ thống có BSD find, có một bộ tính năng khác. Nếu bạn đang viết tập lệnh cho busybox, bạn sẽ thấy có các phiên bản khác nhau với ncs hoàn toàn khác nhau . Đó là những thứ luôn có được tôi khi tôi triển khai một kịch bản đến các môi trường khác nhau.

Để đọc thêm về thực hành kịch bản shell tốt, cũng có một tài nguyên tốt trên blog của David Pashley: Writing Robust Bash Shell Script

Ngoài ra, hãy chắc chắn rằng bạn đã đọc câu trả lời và nhận xét của Gilles trên trang web này. Anh ta có rất nhiều lời khuyên về việc đảm bảo bạn sử dụng mã di động.


5

Viết một kịch bản shell trong một shell cụ thể có nghĩa là đã cài đặt shell đó. Tiêu chuẩn duy nhất là phải có cshshcài đặt trên tất cả các biến thể Unix. Vì vậy, nếu bạn muốn tập lệnh của mình chạy trên Solaris, * BSD và GNU thì bạn sẽ phải viết nó vào, giả sử, vỏ Bourne.

Tuy nhiên, hầu hết các lệnh Unix có các cú pháp khác nhau theo các cách triển khai khác nhau - hãy xem pstrong Solaris, FreeBSD và GNU - vì vậy tùy thuộc vào công cụ bạn sử dụng, tập lệnh của bạn có thể không di động được. Trường hợp vỏ được cài đặt cũng sẽ quan trọng. Là nó /bin/bash /usr/bin/bash, /usr/local/bin/bashhoặc ở một nơi khác?

Tôi không biết về bất kỳ tiêu chuẩn xác định một vỏ. Hãy xem RC hoặc http://192.220.96.201/es/es-usenix-winter93.html`">es cho các vỏ không tiêu chuẩn kỳ lạ. Tuy nhiên, những thứ đó dường như vẫn phù hợp với một số ý tưởng phổ biến.


7
POSIX định nghĩa sh.
Random832
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.