Chỉ bao gồm 1) câu hỏi của bạn.
API tự nhiên luôn có thể thay đổi theo ý muốn của người tạo và do đó phá vỡ phần mềm phụ thuộc, bằng bất kỳ ngôn ngữ nào. Điều đó nói rằng, ý tưởng tuyệt vời của "API" I / O của các công cụ Unix là thực tế không có (có thể 0x0a
là đầu cuối dòng). Một tập lệnh tốt lọc dữ liệu bằng các công cụ Unix thay vì tạo nó. Điều đó có nghĩa là tập lệnh của bạn có thể bị hỏng do thông số đầu vào hoặc đầu ra thay đổi, nhưng không phải do định dạng I / O (một lần nữa, thực sự không phải là một) công cụ riêng lẻ được sử dụng trong tập lệnh đã thay đổi (vì thứ gì đó không thực sự tồn tại không thể thực sự thay đổi).
Đi qua một danh sách các công cụ cơ bản, có một số ít mà tôi cũng thuộc tính nhà sản xuất , trái ngược với chỉ bộ lọc:
- wc - in số byte, từ, dòng - định dạng rất đơn giản, do đó hoàn toàn không có khả năng thay đổi, và hơn nữa không có khả năng được sử dụng trong tập lệnh.
- khác biệt - đã phát triển các định dạng đầu ra khác nhau nhưng tôi không nghe thấy bất kỳ vấn đề nào. Cũng không thường được sử dụng mà không có sự giám sát.
- ngày - Bây giờ ở đây chúng tôi thực sự phải quan tâm những gì chúng tôi sản xuất, đặc biệt là liên quan đến ngôn ngữ hệ thống. Nhưng nếu không, định dạng đầu ra là RFC'ed do bạn không tự xác định chính xác.
- cal - chúng ta đừng nói về nó, tôi biết rằng định dạng đầu ra không khác nhau nhiều giữa các hệ thống.
- ls , who , w , last - Tôi không thể giúp nếu bạn muốn phân tích ls, nó không có nghĩa là gì. Ngoài ra, ai, w, cuối cùng, là những người nghe tương tác nhiều hơn; Nếu bạn sử dụng chúng trong một kịch bản, bạn phải quan tâm những gì bạn làm.
- thời gian đã được chỉ ra trong một bài khác. Nhưng vâng, nó giống như với ls. Thêm để sử dụng tương tác / địa phương. Và bash dựng sẵn rất khác với phiên bản GNU và phiên bản GNU đã có các lỗi không được trộn trong nhiều năm. Đừng dựa vào nó.
Dưới đây là các công cụ mong đợi một định dạng đầu vào cụ thể cụ thể hơn là một luồng byte:
- bc , dc - máy tính. Đã ở khía cạnh hackish hơn của mọi thứ (thực sự, tôi không sử dụng chúng trong các tập lệnh), và có lẽ các định dạng I / O rất ổn định.
Có một khu vực khác có nguy cơ bị phá vỡ cao hơn nhiều, đó là giao diện dòng lệnh. Hầu hết các công cụ có các tính năng khác nhau cả trên các hệ thống và trên dòng thời gian. Ví dụ là
- Tất cả các công cụ sử dụng regex - regex có thể thay đổi ý nghĩa dựa trên ngôn ngữ hệ thống (ví dụ LC_COLLATE) và có nhiều sự tinh tế và phân tử trong quá trình triển khai regex.
- Đơn giản là đừng sử dụng các công tắc ưa thích. Bạn có thể dễ dàng sử dụng
man 1p find
, ví dụ, để đọc POSIX find manpage thay vì manpage hệ thống. Trên hệ thống của tôi, tôi cần cài đặt manpages-posix.
Và ngay cả khi sử dụng các công tắc như vậy, thông thường sẽ không có lỗi nào được giới thiệu một cách tinh tế và làm độc hại dữ liệu của bạn. Hầu hết các chương trình sẽ chỉ từ chối làm việc với một chuyển đổi không xác định.
Để kết luận, tôi sẽ nói rằng shell thực sự có tiềm năng trở thành một trong những ngôn ngữ di động nhất (nó có thể di động khi bạn viết kịch bản một cách hợp lý). So sánh với các ngôn ngữ kịch bản yêu thích của bạn, nơi xảy ra lỗi tinh vi hoặc chương trình biên dịch yêu thích của bạn sẽ được biên dịch.
Ngoài ra, tại những nơi hiếm hoi có thể xảy ra sự cố do không tương thích, có thể không phải do thời gian gây ra mà do sự đa dạng trên các hệ thống khác nhau (có nghĩa là nếu nó hoạt động cho bạn, nó đã làm như vậy 20 năm trước và sẽ trong 20 năm , quá). Đó là một hệ quả của sự đơn giản của các công cụ.