Dotyczy tylko 1) Twojego pytania.
Oczywiście interfejsy API mogą zawsze zmieniać się zgodnie z wolą ich twórców, a tym samym psować zależne oprogramowanie w dowolnym języku. To powiedziawszy, świetnym pomysłem „interfejsów” I / O narzędzi uniksowych jest to, że praktycznie nie ma żadnych (być może 0x0a
na końcu linii). Dobry skrypt filtruje dane za pomocą narzędzi uniksowych zamiast je tworzyć. Oznacza to, że skrypt może się zepsuć, ponieważ zmieniono specyfikację wejścia lub wyjścia, ale nie dlatego, że zmienił się format we / wy (ponownie tak naprawdę nie ma jednego) poszczególnych narzędzi używanych w skrypcie (ponieważ coś, co tak naprawdę nie istnieje) tak naprawdę nie mogę się zmienić).
Przeglądając listę podstawowych narzędzi, jest kilka, które przypisałbym również producentowi , a nie tylko filtrowaniu:
- wc - wypisuje liczbę bajtów, słów, wierszy - bardzo prosty format, więc absolutnie mało prawdopodobne, aby się zmienił, a ponadto mało prawdopodobne, aby był używany w skrypcie.
- diff - ewoluowały różne formaty wyjściowe, ale nie słyszałem o żadnych problemach. Zwykle również nie jest używane bez nadzoru.
- data - teraz naprawdę musimy zadbać o to, co produkujemy, szczególnie w odniesieniu do ustawień regionalnych systemu. Ale w przeciwnym razie format wyjściowy jest RFC, ponieważ nie określasz go dokładnie sam.
- cal - nie rozmawiajmy o tym, wiem, że format wyjściowy bardzo różni się w zależności od systemu.
- ls , który , w , ostatni - nie mogę pomóc, jeśli chcesz analizować ls, to po prostu było nie tak miało być. Ponadto, którzy, w końcu, są bardziej interaktywnymi listerami; Jeśli używasz ich w skrypcie, musisz uważać na to, co robisz.
- czas został wskazany w innym poście. Ale tak, to jest tak samo jak z ls. Więcej do użytku interaktywnego / lokalnego. A wbudowane bash bardzo różni się od wersji GNU, a wersja GNU ma naprawione błędy od wielu lat. Tylko nie polegaj na tym.
Oto narzędzia, które oczekują, że określony format wejściowy będzie bardziej szczegółowy niż strumień bajtów:
- bc , dc - kalkulatory. Już po bardziej hackerskiej stronie (naprawdę nie używam ich w skryptach) i przypuszczalnie bardzo stabilnych formatach I / O.
Istnieje inny obszar o znacznie wyższym ryzyku uszkodzenia, mianowicie interfejs wiersza poleceń. Większość narzędzi ma różne funkcje zarówno w systemach, jak i na osi czasu. Przykładami są
- Wszystkie narzędzia używające wyrażeń regularnych - wyrażenia regularne mogą zmieniać znaczenie w zależności od ustawień regionalnych systemu (na przykład LC_COLLATE) i istnieje wiele subtelności i osobliwości w różnych implementacjach wyrażeń regularnych.
- Po prostu nie używaj fantazyjnych przełączników. Możesz łatwo użyć
man 1p find
na przykład do odczytania strony podręcznika POSIX zamiast strony systemowej. W moim systemie potrzebuję zainstalowanego manpages-posix.
Nawet podczas korzystania z takich przełączników normalnie błędy nie zostaną subtelnie wprowadzone i nie zatruwają danych. Większość programów po prostu odmawia pracy z nieznanym przełącznikiem.
Podsumowując, powiedziałbym, że powłoka ma potencjał bycia jednym z najbardziej przenośnych języków (przenośny, gdy skrypt jest przenośny). Porównaj z ulubionymi językami skryptowymi, w których występują subtelne błędy, lub z ulubionym skompilowanym programem, który zostanie skompilowany.
Ponadto w rzadkich miejscach, w których może wystąpić uszkodzenie z powodu niezgodności, prawdopodobnie nie spowodowałoby to czasu, ale różnorodność w różnych systemach (co oznacza, że jeśli działa ono dla Ciebie, zrobiłoby to 20 lat wcześniej i będzie za 20 lat , zbyt). Jest to następstwem prostoty narzędzi.