Використовуйте 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
.