Використовуйте sudo apt-get remove ^k3bзамість цього. Коли ви встановлюєте або видаляєте пакети, *це часто небезпечно і рідко потрібно. Якщо ви все-таки використовуєте *, вам слід його цитувати, але це не робить його більш безпечним, оскільки його тенденція вибирати набагато більше пакетів, ніж ви плануєте, є результатом способу aptта apt-getінтерпретації, а не ефектом розширення імені шляху .
- Навіть безпечне використання
* є часто непотрібним .
- Небезпечне використання - жорстоке . Видалення
k3b*видаляє кожен пакунок, який містить k3 будь-яке його ім’я (і кожен пакунок, який залежить від такого пакета). Це не помилка друку k3, достатня навіть без b, тому що b*означає "нуль або більше bs".
При запуску 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.