использование sudo apt-get remove ^k3b
вместо этого. Когда вы устанавливаете или удаляете пакеты, *
это часто опасно и редко требуется. Если вы используете *
, вы должны заключить его в кавычки, но это не делает его более безопасным, потому что его тенденция выбирать гораздо больше пакетов, чем вы предполагаете, является результатом способа apt
и apt-get
интерпретировать его, а не эффект расширения имени пути .
- Даже безопасное использование
*
является часто ненужным .
- Небезопасное использование жестоко . Удаление
k3b*
удаляет каждый пакет, который содержится в k3
любом месте его имени (и каждый пакет, который зависит от такого пакета). Это не опечатка - k3
достаточно наличия даже без b
, потому что b*
означает «ноль или более b
s».
Когда ты бежишь apt
или apt-get
с действием install
, remove
или purge
, каждый последующий аргумент является первым 1 интерпретируется как имя отдельного пакета. Если пакет с таким точным именем существует, для него выполняется действие.
Если такого пакета нет apt
и apt-get
он проверит, содержит ли аргумент какие-либо из общих метасимволов 2 регулярного выражения , .
?
, +
,*
, |
, \[
, ^
, или$
. Если нет, то сделано - пакет не найден.
Если это действительно содержит любой из этих символов, то он обрабатывается как регулярное выражение и сопоставляется с любой частью любого имени пакета. Это не должно соответствовать целому имени. Как уже говорили другие, *
регулярное выражение не означает то же самое, что *
и глобус. ?
тоже нет В регулярном выражении:
*
позволяет предыдущему элементу появляться любое количество раз включая только один раз или вообще не - вместо ровно одного раза.
?
делает предыдущий элемент необязательным - то есть, он позволяет ему появляться ноль или один раз.
apt-get (8) ( man apt-get
) говорит:
Если ни один пакет не соответствует данному выражению, и выражение содержит один из '.', '?' или '*', тогда предполагается, что это регулярное выражение POSIX, и оно применяется ко всем именам пакетов в базе данных. Любые совпадения затем устанавливаются (или удаляются). Обратите внимание, что сопоставление выполняется с помощью подстроки, поэтому 'lo. *' Соответствует 'how-lo' и 'наименьшему' Если это нежелательно, закрепите регулярное выражение символом «^» или «$» или создайте более конкретное регулярное выражение.
Упоминает только страница руководства .
, ?
и *
, но она является неполной , так как +
, |
, [
, ^
и $
также достаточно , чтобыapt-get
или apt
интерпретировать шаблон как регулярное выражение. 3
Хотя вы можете сопоставить любое количество любых символов с .*
- не просто - *
вам это нужно, только если оно будет появляться в середине вашего регулярного выражения. Поскольку шаблон сопоставляется с любой подстрокой имени пакета, он не имеет смысла в конце (или начале) шаблона.
В справочной странице упоминается ^
и$
. Они (особенно ^
) являются ключевыми для написания безопасных, эффективных схем для использования с install
, remove
или purge
действий в apt
или apt-get
.
^
привязывает регулярное выражение к началу всей строки. ^k3b
выбирает все пакеты, имена которых начинаются с k3b
.
$
привязывает регулярное выражение к концу всей строки. k3b$
выбрал бы все пакеты, имена которых заканчиваются на k3b
.
Поэтому вы можете использовать эту команду для безопасного удаления пакетов:
sudo apt-get remove ^k3b
Наконец, в конкретном случае, который вы упомянули, вы могли бы просто передать оба имени самостоятельно:
sudo apt-get remove k3b k3b-data
Тогда вы избежите всей этой сложности! (Хотя привязка к нему ^
проста, когда вы к нему привыкли.) Или используйте расширение скобки , которое ваша оболочка раскрывает в приведенную выше команду:
sudo apt-get remove k3b{,-data}
1 Есть два исключения из этого: (а) некоторые параметры (например, -f
, --purge
) признаются, и (б) некоторые знаки пунктуации , появляющиеся в конце аргумента , которые иначе были бы приняты в качестве имени пакета , чтобы выполнить действие , может быть используется для изменения того, что сделано (например, sudo apt install ubuntu-desktop^
устанавливает задачу, а не пакет, и когда ^
появляется в конце).
2 Существуют и другие метасимволы регулярных выражений. Например, \
поддерживается все диалекты регулярных выражений и часто используются. .
, ?
, +
, *
, |
, [
, ^
, И$
просто оказались метасимволами метких разработчики решили бы вызвать интерпретацию как регулярное выражение (после разрешения в качестве точного пакета с именем не удался).
3 Самый простой способ убедиться в этом - смоделировать установку или удаление с таким шаблоном, используя -s
опцию, как описано выше. Например, запуск apt -s install ^virtualbox
шоу показывает, что sudo apt install ^virtualbox
попытка установить каждый пакет, о котором менеджер пакетов знает, с чьего имени начинается virtualbox
. Однако такое поведение также можно проверить, изучив исходный код . Проверьте CacheSetHelper::PackageFromRegEx
функцию в cacheset.cc
.