`apt-get` и подстановочные знаки: globs vs. regex

Изменить: Обратите внимание, что, как написано ниже, я знаю ответы на этом сайте, объясняя, что apt-get использует регулярное выражение для интерпретации имен пакетов. На самом деле вопрос непосредственно связан с тем, каким образом его фактическое поведение отличается от его документированного. Пожалуйста, прочитайте вопрос, прежде чем предлагать дубликат.

Некоторые ответы на этом сайте предупреждают об использовании apt-get с помощью подстановочных знаков (т. Е. Звездочек: *), поскольку apt-get предположительно расширяет их как регулярные выражения, что может дать неожиданные (и нежелательные) результаты, особенно с apt-get remove. На самом деле, страница Ubuntu man для apt-get читает:

Если пакет не соответствует указанному выражению, а выражение содержит один из «.», «?», или '*', то предполагается, что это регулярное выражение POSIX, и оно применяется ко всем именам пакетов в базе данных. Любые совпадения затем устанавливаются (или удаляются). Обратите внимание, что сопоставление выполняется подстрокой, поэтому «lo. *» Соответствует «how-lo» и «lower». Если это нежелательно, привяжите регулярное выражение символом «^» или «$» или создайте более определенное регулярное выражение.

На самом деле, страница Ubuntu man для apt-get утверждает:

Если пакет не соответствует указанному выражению, а выражение содержит один of '.', '?' или '*', то предполагается, что это регулярное выражение POSIX, и оно применяется ко всем именам пакетов в базе данных. Любые совпадения затем устанавливаются (или удаляются). Обратите внимание, что сопоставление выполняется подстрокой, поэтому «lo. *» Соответствует «how-lo» и «lower». Если это нежелательно, привяжите регулярное выражение символом «^» или «$» или создайте более определенное регулярное выражение.

apt-get принимает регулярное выражение, а не глобус шаблон как оболочка.

$ sudo apt-get install -s 'meld*' [...] Note, selecting 'meld' for glob 'meld*' [...] $ sudo apt-get install -s 'meldt*' [...] Note, selecting 'python-meld3' for regex 'meldt*' Note, selecting 'python3-meld3' for regex 'meldt*' Note, selecting 'meld' for regex 'meldt*' [...]

Я считаю, что это неправильно (по крайней мере, от Xenial). Например, я могу воспроизвести следующее поведение:

(Я не удалял совпадений, только несущественные части ответа apt-get.)

Казалось бы, , основанный на этом поведении, что apt-get сначала пытается сопоставить данные выражения в виде глобусов, и только если он терпит неудачу, повторит ли он как регулярные выражения.

5
задан 14 June 2017 в 19:18

3 ответа

Это объясняется в man-странице apt(8):

install, remove, purge (apt-get(8))
   Performs the requested action on one or more packages specified via
   regex(7), glob(7) or exact match. The requested action can be
   overridden for specific packages by append a plus (+) to the
   package name to install this package or a minus (-) to remove it.

Этот абзац не существует в apt(8) manpage , поэтому он может быть добавлен в 16.04 .

Это, похоже, не упоминается в журнале изменений apt - коммит, который добавил это в 2013 году, не показывает никаких изменений в manpages. Это было ненадолго отключено и повторно включено позже (см. Фиксации в период с мая по февраль 2014 года), а отключение указано в журнале изменений.

Таким образом, это может быть добавлено четыре года назад, но добавил это в 2013 году . Управляющая страница apt-get остается заброшенной.

1
ответ дан 22 May 2018 в 21:32
  • 1
    Понимаю. Насколько я могу судить, порядок операций противоположный тому, что подразумевается на странице man; то есть apt (и apt-get) сначала ищет совпадения glob, и только ищет соответствия регулярных выражений, если это не удалось. Я не знаю, как и где проверить, что (хотя ссылки, которые вы указали, предлагают fileutl.{cc,h}, apt-pkg/policy.cc и / или apt-pkg/versionmatch.cc); какие-либо предложения? – Jonathan Y. 15 June 2017 в 10:53
  • 2
    @JonathanY. возможно, я ошибся, когда он был добавлен. См. apt-pkg/cacheset.cc – muru 15 June 2017 в 11:03
  • 3
    Боюсь, это немного над моей головой. Эта функция возвращает список совпадений в глобальных переменных, помимо объявленного типа функций Boolean? В любом случае, правильно ли я предполагаю, что путь вперед - это открыть проблему GitHub о документации? (Кроме того, как вы, вероятно, можете сказать, любое предложение, которое вы можете иметь о том, где идет эта проблема, и то, что он должен указать - или осмелюсь спросить, поможет открыть его - будет очень признателен.) – Jonathan Y. 15 June 2017 в 11:11
  • 4
    Поскольку это Debian, проблема обычно идет в bugs.debian.org . Я подал его вам: bugs.debian.org/cgi-bin/bugreport.cgi?bug=864811 . Вы можете создать PR на Github, если хотите, и указать этот номер ошибки. – muru 15 June 2017 в 11:49

Это объясняется в man-странице apt(8):

install, remove, purge (apt-get(8)) Performs the requested action on one or more packages specified via regex(7), glob(7) or exact match. The requested action can be overridden for specific packages by append a plus (+) to the package name to install this package or a minus (-) to remove it.

Этот абзац не существует в apt(8) manpage , поэтому он может быть добавлен в 16.04 .

Это, похоже, не упоминается в журнале изменений apt - коммит, который добавил это в 2013 году, не показывает никаких изменений в manpages. Это было ненадолго отключено и повторно включено позже (см. Фиксации в период с мая по февраль 2014 года), а отключение указано в журнале изменений.

Таким образом, это может быть добавлено четыре года назад, но добавил это в 2013 году . Управляющая страница apt-get остается заброшенной.

1
ответ дан 18 July 2018 в 11:39

Это объясняется в man-странице apt(8):

install, remove, purge (apt-get(8)) Performs the requested action on one or more packages specified via regex(7), glob(7) or exact match. The requested action can be overridden for specific packages by append a plus (+) to the package name to install this package or a minus (-) to remove it.

Этот абзац не существует в apt(8) manpage , поэтому он может быть добавлен в 16.04 .

Это, похоже, не упоминается в журнале изменений apt - коммит, который добавил это в 2013 году, не показывает никаких изменений в manpages. Это было ненадолго отключено и повторно включено позже (см. Фиксации в период с мая по февраль 2014 года), а отключение указано в журнале изменений.

Таким образом, это может быть добавлено четыре года назад, но добавил это в 2013 году . Управляющая страница apt-get остается заброшенной.

1
ответ дан 24 July 2018 в 19:50

Другие вопросы по тегам:

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