Насколько стабильный является оболочка Unix “stdin/stdout API”?

Режим C (и конкретно c-mode-map переменная), обеспечивается названным пакетом cc-mode, нет c-mode.

(eval-after-load 'cc-mode
  '(define-key c-mode-map (kbd "C-") 'compile))

Для Вашего другого метода, поскольку уже ответил vschum, Вы пропускаете список аргументов в Вашем defun. Кроме того, c-mode-common-hook не правильное место для этого: это выполнилось каждый раз, когда Вы переходите к режиму C. Правильное время для добавления привязки - когда режим C загружается; можно сделать это любой через генерала eval-after-load механизм как выше, или через c-initialization-hook:

(defun my-c-mode-common-hook ()
  (define-key c-mode-map (kbd "C-") 'compile))
(add-hook 'c-initialization-hook 'my-c-mode-common-hook)

20
01.07.2012, 20:48
6 ответов

Стандарт POSIX 2008 года имеет описание раздела "Shell и Утилиты". Обычно, если Вы придерживаетесь этого, Ваши сценарии должны довольно соответствовать требованиям завтрашнего дня, кроме возможно для депрекаций, но они едва происходят в течение ночи, таким образом, у Вас должно быть много времени для обновления сценариев.

В некоторых случаях, где выходной формат для единственной утилиты значительно различается через платформы и версии, стандарт POSIX может включать опцию, обычно названную -p или -P который указывает гарантируемый и предсказуемый выходной формат. Пример этого time утилита, которая имеет широко переменные реализации. При необходимости в стабильном API/выходном формате Вы использовали бы time -p.

Если необходимо использовать утилиту фильтра, которая не охвачена стандартом POSIX, то Вы в значительной степени во власти поставщиков программного блока распределения / восходящие разработчики, как Вы во власти удаленных веб-разработчиков при выполнении веб-очистки.

17
27.01.2020, 19:44

Я попытаюсь ответить на основе своего опыта.

  1. Команды действительно не придерживаются формальной спецификации, но они действительно придерживаются требования, чтобы использовать и генерировать ориентированный на строку на текст.

  2. Да, конечно. Прежде чем утилиты GNU стали фактическим стандартом, у большого количества поставщиков будет изворотливый вывод, особенно относительно ps и ls. Это вызвало много боли. Сегодня, только HP поставляет суперизворотливые команды. Исторически, утилиты Berkeley Software Distribution (BSD) были главным разрывом с прошлым. Спецификация POSIX была разрывом с прошлым, но теперь это широко принято.

  3. Команды Unix действительно назревали со временем. Все еще не невозможно повредить некоторый сценарий, записанный для более старой версии. Думайте о недавней тенденции к UTF-8 как кодирование текстового файла. Это изменение требовало изменять основные утилиты как tr. В прошлом простым текстом был почти всегда ASCII (или что-то закрывается), таким образом, прописные буквы сформировали числовой диапазон, также, как и строчные буквы. Это больше не верно с UTF-8, таким образом, tr добирается, чтобы принять, что различные параметры командной строки указывают вещи как "прописной" или "алфавитно-цифровое".

  4. Один из лучших способов "усилить" Ваши фильтры не состоит в том, чтобы зависеть от конкретного текстового расположения. Например, не делать cut -c10-24, который зависит от положений строки. Использовать cut -f2 вместо этого, который прервал бы 2-е, разделенное от вкладки поле. awk повреждения любая входная строка в 1$, 2$, 3$..., которые являются пробелом, разделенным по умолчанию. Зависьте от высокоуровневых понятий как "поля", а не понятий низшего уровня как позиция столбцов. Кроме того, используйте регулярные выражения: sed и awk может оба сделать вещи с регулярными выражениями, которые не заботятся о некотором различии во входе. Другой прием должен обработать вход во что-то, в отношении формата которого Ваш фильтр может быть требователен. Использовать tr -cs '[a-zA-z0-9]' '[\n]' повредить текст в отдельное слово на строку, без пунктуации. Вы просто не заботитесь о том, на что входной текст похож в этом случае.

12
27.01.2020, 19:44

Во-первых, очень краткие ответы на Ваши вопросы:

  1. Формальная стандартизация конвенций ввода/вывода: нет
  2. Поломка в просроченном к изменению вывода: да
  3. Абсолютно невозможный повредить будущие фильтры: нет
  4. Как может я защищать меня от изменений: будьте консервативны

При высказывании "API" Вы используете термин, который (хорошо это или плохо) подразумевает слишком много формальности вокруг конвенций ввода/вывода фильтра. Очень (и я действительно имею в виду "очень"), широко, основные конвенции для данных, которые любезны к легкой фильтрации,

  • каждая входная строка является полной записью
  • в каждой записи поля разделяются известным символом-разделителем

Классическим примером был бы формат/etc/passwd. Но, эти конвенции по умолчанию, вероятно, нарушаются до некоторой степени чаще, чем они сопровождаются к букве.

  • Существует много фильтров (часто пишется в awk или жемчуге) та мультилиния синтаксического анализа форматы ввода.
  • Существует много входных наборов (например,/var/log/messages), где нет никакой четко определенной полевой структуры, и должны использоваться более общие основанные на регулярном выражении методы.

Вашим четвертым вопросом, как защитить себя от вариаций в выходной структуре, является действительно единственный, о котором можно сделать что-либо.

  • Как @jw013 сказал, посмотрите на то, что говорят posix стандарты. Конечно, posix не указывает все команды, которые Вы захотите использовать в качестве входных источников.
  • Если Вы хотите, чтобы Ваши сценарии были портативными, старайтесь избегать индивидуальных особенностей безотносительно версии некоторой команды, которую Вы, оказывается, установили. Например, много версий GNU стандартных команд Unix имеют нестандартные расширения. Они могут быть полезными, но необходимо избежать их, если Вы хотите максимальную мобильность.
  • Попытайтесь изучить, какие подмножества аргументов команд и выходных форматов имеют тенденцию быть стабильными через платформы. К сожалению, это требует доступа к нескольким платформам наряду со временем, потому что эти различия не будут записаны нигде, даже неофициально.

В конце Вы не можете защитить себя полностью от проблем, по поводу которых Вы волнуетесь, и нет никакого единственного места для смотрения для "категорического" оператора того, что должна сделать определенная команда. Для многих сценариев оболочки, особенно записанные для персонального или небольшого использования, это просто не проблема

9
27.01.2020, 19:44

Только покрывая 1) Вашего вопроса.

Естественно API могут всегда изменяться в желании их создателей и таким образом повреждать зависимое программное обеспечение на любом языке. Тем не менее прекрасная идея относительно инструментов Unix, которые ввод-вывод "API" - то, что нет практически ни одного (возможно, 0x0a как конец строки). Хороший сценарий фильтрует данные с инструментами Unix вместо того, чтобы создать его. Это означает, что Ваш сценарий может повредиться, потому что спецификация ввода или вывода изменилась, но не потому что формат ввода-вывода (снова, нет действительно одного) отдельных инструментов, используемых в измененном сценарии (потому что что-то, что действительно не существует, не может действительно измениться).

При прохождении через списка основных инструментов существуют немногие, что я также приписал бы производителя, только в противоположность фильтру:

  • туалеты - печатают число байтов, слов, строк - очень простой формат, таким образом абсолютно вряд ли, чтобы измениться и кроме того не очень вероятно, чтобы использоваться в сценарии.
  • разность - там развила различные выходные форматы, но я не услышал ни о каких проблемах. Также не обычно используемый без контроля.
  • дата - Теперь здесь мы действительно должны заботиться, что мы производим, особенно относительно системной локали. Но иначе выходной формат является RFC'ed, учитывая Вас, точно не указывают его самих.
  • cal - давайте не говорить об этом, я знаю, что выходной формат действительно отличается очень через системы.
  • ls, кому, w, в последний раз - я не могу помочь, если Вы хотите проанализировать ls, он просто, не был предназначен, чтобы быть. Кроме того, кто, w, в последний раз, являются более интерактивным listers; при использовании их в сценарии, необходимо заботиться, что Вы делаете.
  • на время указали в другом сообщении. Но да, это совпадает с с ls. Больше для интерактивного/локального использования. И встроенный удар очень отличается от версии GNU, и версия GNU много лет имела открепленные ошибки. Просто не полагайтесь на него.

Вот инструменты, которые ожидают конкретный формат ввода, более конкретный, чем быть потоком байтов:

  • до н.э, dc - калькуляторы. Уже на большем количестве hackish стороны вещей (действительно, я не использую их в сценариях), и по-видимому очень стабильные форматы ввода-вывода.

Существует другая область с намного более высоким риском поломки, а именно, интерфейса командной строки. Большинство инструментов имеет отличающиеся функции и через системы и через временную шкалу. Примеры

  • Все инструменты с помощью regex - regex могут изменить значение на основе системной локали (например, LC_COLLATE) и существует много тонкости и pecularities через regex реализации.
  • Просто не используйте необычные переключатели. Можно легко использовать man 1p find например, для чтения POSIX находят страницу справочника вместо системной страницы справочника. В моей системе мне нужны установленные страницы-справочника-posix.

И даже когда с помощью таких переключателей, обычно там ошибки не будут тонко представлены и отравят данные. Большинство программ просто откажется работать с неизвестным переключателем.

В заключение, я сказал бы, что оболочка имеет на самом деле потенциал того, чтобы быть одним из большинства портативных языков (это портативно, когда Вы пишете сценарий портативно). Сравните со своими любимыми языками сценариев, где тонкие ошибки происходят, или Ваш фаворит скомпилировал программу, которая уступит компиляции.

Кроме того, в редких местах, где поломка может произойти из-за несовместимостей, она, вероятно, была бы не из-за вызванного времени, но из-за разнообразия через различные системы (значение, если она работает на Вас, она сделала так за 20 лет до этого и будет через 20 лет, также). Это - заключение простоты инструментов.

5
27.01.2020, 19:44

Существуют только фактические стандарты IO — пробел и пустой указатель разделили вывод.

Что касается совместимости, мы обычно возвращаемся к проверке номеров версий отдельных фильтров. Не то, чтобы они изменяются очень, но когда Вы хотите использовать совершенно новую функцию и все еще хотеть, чтобы сценарий работал на более старых версиях, у Вас есть к "ifdef" он так или иначе. Нет практически никакого механизма создания отчетов возможности, сохраните для того, чтобы вручную записать тестовые сценарии.

1
27.01.2020, 19:44

Сценарии действительно повреждаются, некоторые чаще, чем другие. Старое и известное программное обеспечение имеет тенденцию относительно оставаться таким же и часто имеет флаги совместимости, когда оно изменяется так или иначе.

Сценарии, записанные в одной системе, имеют тенденцию продолжать работу, но часто повреждать другого.

0
27.01.2020, 19:44

Теги

Похожие вопросы