ใช้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การดำเนินการในหรือaptapt-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::PackageFromRegExcacheset.cc