ใช้sudo apt-get remove ^k3b
แทน เมื่อคุณติดตั้งหรือลบแพ็คเกจ*
มักเป็นอันตรายและไม่จำเป็น ถ้าคุณทำเช่นการใช้งาน*
คุณควรพูด แต่นั่นก็ไม่ได้ทำให้มันปลอดภัยมากขึ้นเพราะแนวโน้มที่จะเลือกแพคเกจที่ไกลมากขึ้นกว่าที่คุณตั้งใจที่เป็นผลมาจากวิธีการapt
และการapt-get
แปลความหมายของมันและไม่ได้ผลของการขยายตัวของพา ธ
- แม้การใช้งานความปลอดภัยของการ
*
เป็นมักจะไม่จำเป็น
- การใช้งานที่ไม่ปลอดภัยจะโหดร้าย การ
k3b*
ลบจะลบทุกแพ็คเกจที่มีk3
ที่ใดก็ได้ในชื่อ (และทุกแพ็คเกจที่ขึ้นอยู่กับแพ็คเกจดังกล่าว) นั่นไม่ใช่การพิมพ์ผิดที่k3
เพียงพอแม้จะไม่มีb
เพราะb*
หมายถึง "ศูนย์หรือมากกว่าb
นั้น"
เมื่อคุณเรียกใช้apt
หรือapt-get
กับinstall
, remove
หรือpurge
การกระทำแต่ละอาร์กิวเมนต์ที่ตามมาเป็นครั้งแรก1ตีความว่าเป็นชื่อของแพคเกจของแต่ละบุคคล หากมีแพ็คเกจที่มีชื่อที่แน่นอนนั้นจะมีการดำเนินการให้
ถ้าไม่มีแพคเกจดังกล่าวapt
และapt-get
จะตรวจสอบว่ามีการโต้แย้งใด ๆ ที่พบการแสดงออกปกติ metacharacters 2 .
, ?
, +
,*
, |
, \[
, หรือ^
$
ถ้าไม่ทำก็เสร็จ - ไม่พบแพ็คเกจ
ถ้ามันไม่มีการใด ๆ ของตัวละครเหล่านั้นแล้วก็จะถือว่าเป็นนิพจน์ปกติและจับคู่กับส่วนใดส่วนหนึ่งของชื่อแพคเกจใด ๆ ไม่จำเป็นต้องตรงกับชื่อทั้งหมด อย่างที่คนอื่น ๆ พูดกัน*
ในการแสดงออกปกติไม่ได้มีความหมายเหมือนกับ*
ในกลม ?
ไม่เหมือนกัน ในการแสดงออกปกติ:
*
อนุญาตให้รายการก่อนหน้าปรากฏจำนวนครั้งใดก็ได้รวมถึงเพียงครั้งเดียวหรือไม่เลยแทนที่จะเป็นครั้งเดียว
?
ทำให้รายการก่อนหน้านี้เป็นตัวเลือก -นั่นคืออนุญาตให้ปรากฏเป็นศูนย์หรือหนึ่งครั้ง
apt-get (8) ( man apt-get
) พูดว่า:
หากไม่มีแพ็คเกจที่ตรงกับนิพจน์ที่กำหนดและนิพจน์มีหนึ่งใน '.', '?' หรือ '*' จากนั้นจะถือว่าเป็นนิพจน์ปกติ POSIX และใช้กับชื่อแพ็กเกจทั้งหมดในฐานข้อมูล การแข่งขันใด ๆ ที่ติดตั้งแล้ว (หรือลบ) โปรดทราบว่าการจับคู่จะกระทำโดยสตริงย่อยดังนั้น 'lo. *' จะจับคู่ 'How-Lo' และ 'ต่ำสุด' หากสิ่งนี้ไม่พึงประสงค์ให้สมอนิพจน์ทั่วไปด้วยอักขระ '^' หรือ '$' หรือสร้างนิพจน์ทั่วไปที่เฉพาะเจาะจงมากขึ้น
manpage เพียงกล่าวถึง.
, ?
และ*
แต่มันเป็นเรื่องที่ไม่สมบูรณ์เช่น+
, |
, [
, ^
และ$
นอกจากนี้ยังมีเพียงพอที่จะให้apt-get
หรือapt
ตีความรูปแบบเช่นการแสดงออกปกติ 3
แม้ว่าคุณจะสามารถจับคู่กับอักขระจำนวนเท่าใดก็ได้ด้วย.*
- ไม่ใช่แค่- *
คุณต้องการเพียงสิ่งนี้หากมันจะปรากฏขึ้นตรงกลางของการแสดงออกปกติของคุณ เนื่องจากรูปแบบถูกจับคู่กับซับสตริงใด ๆ ของชื่อแพ็กเกจจึงไม่มีจุดหมายที่จุดสิ้นสุด (หรือเริ่มต้น) ของรูปแบบ
manpage กล่าวและ^
$
เหล่านี้ (โดยเฉพาะ^
) เป็นกุญแจสำคัญในการเขียนความปลอดภัยรูปแบบที่มีประสิทธิภาพสำหรับใช้กับ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 ตัวบ่งชี้การแสดงออกปกติอื่น ๆ ที่มีอยู่ ตัวอย่างเช่น\
ได้รับการสนับสนุนโดยภาษาถิ่นทั้งหมดของการแสดงออกปกติและใช้กันทั่วไป .
, ?
, +
, *
, |
, [
, ^
และ$
เพียงแค่เกิดขึ้นจะ metacharacters ที่นักพัฒนา APT ตัดสินใจที่จะเรียกการตีความเป็นนิพจน์ปกติ (หลังความละเอียดเป็นแพคเกจที่แน่นอนชื่อล้มเหลว)
3 วิธีที่ง่ายที่สุดในการตรวจสอบสิ่งนี้คือการจำลองการติดตั้งหรือลบด้วยรูปแบบดังกล่าวโดยใช้-s
ตัวเลือกตามที่อธิบายไว้ข้างต้น ยกตัวอย่างเช่นการทำงานapt -s install ^virtualbox
แสดงให้เห็นว่าจะมีผลกระทบต่อความพยายามที่จะติดตั้งแพคเกจแพคเกจผู้จัดการรู้เกี่ยวกับที่มีชื่อขึ้นต้นด้วยทุกคนsudo apt install ^virtualbox
virtualbox
อย่างไรก็ตามพฤติกรรมนี้ยังสามารถตรวจสอบได้โดยการตรวจสอบรหัสที่มา ตรวจสอบฟังก์ชั่นในCacheSetHelper::PackageFromRegEx
cacheset.cc