Только покрытие 1) вашего вопроса.
Естественно, API-интерфейсы всегда могут изменяться по желанию их создателей и, таким образом, нарушать зависимое программное обеспечение на любом языке. Тем не менее, отличная идея API-интерфейсов ввода / вывода инструментов Unix заключается в том, что их практически нет (возможно, 0x0a
в конце строки). Хороший скрипт фильтрует данные с помощью инструментов Unix, а не создает их. Это означает, что ваш скрипт может сломаться из-за изменения спецификации ввода или вывода, но не потому, что изменился формат ввода / вывода (опять же, на самом деле его нет) отдельных инструментов, используемых в скрипте (потому что что-то, чего на самом деле не существует) не может действительно измениться).
Просматривая список базовых инструментов, я бы также отнес атрибут производителя к списку основных инструментов , а не только к фильтру:
- Туалет - вывести количество байтов, слов, строк - очень простой формат, поэтому вряд ли изменится, и, кроме того, вряд ли будет использоваться в скрипте.
- diff - есть разные форматы вывода, но я не слышал о каких-либо проблемах. Также обычно не используется без присмотра.
- свидание - теперь здесь мы действительно должны позаботиться о том, что мы производим, особенно в отношении локали системы. Но в противном случае выходной формат RFC, если вы не укажете его сами.
- кал - давайте не будем об этом, я знаю, что выходной формат очень сильно отличается в разных системах.
- LS , кто , W , последний - я не могу помочь, если вы хотите разобрать ls, это просто не должно было быть. Кроме того, кто, w, последний, являются более интерактивными списками; Если вы используете их в сценарии, вы должны позаботиться о том, что вы делаете.
- время было указано в другом посте. Но да, это так же, как с ls. Больше для интерактивного / локального использования. И встроенная bash сильно отличается от версии GNU, а версия GNU имеет нефиксированные ошибки в течение многих лет. Просто не надейся на это.
Вот инструменты, которые ожидают, что конкретный формат ввода более специфичен, чем поток байтов:
- Ьс , постоянный ток - калькуляторы. Уже на более хакерской стороне вещей (на самом деле, я не использую их в скриптах) и, вероятно, очень стабильные форматы ввода / вывода.
Есть еще одна область с гораздо более высоким риском поломки, а именно интерфейс командной строки. Большинство инструментов имеют разные функции как в разных системах, так и во временной шкале. Примеры
- Все инструменты, использующие регулярное выражение - regex могут изменять значение в зависимости от языкового стандарта системы (например, LC_COLLATE), и в реализациях regex есть много тонкостей и особенностей.
- Просто не используйте модные переключатели. Вы можете легко использовать,
man 1p find
например, чтобы прочитать man-страницу POSIX find вместо системной man-страницы. В моей системе мне нужно установить manpages-posix.
И даже при использовании таких переключателей, как правило, ошибки не будут тонко введены и отравят ваши данные. Большинство программ просто откажутся работать с неизвестным переключателем.
В заключение я бы сказал, что оболочка потенциально может быть одним из самых переносимых языков (она переносима, когда вы пишете сценарий переносимо). Сравните с вашими любимыми языками сценариев, где возникают незначительные ошибки, или вашей любимой скомпилированной программой, которая прекратит компиляцию.
Кроме того, в тех редких местах, где может произойти поломка из-за несовместимости, это, вероятно, произошло бы не из-за времени, а из-за различий в разных системах (то есть, если он работает для вас, он сделал это 20 лет назад и будет через 20 лет). , тоже). Это является следствием простоты инструментов.