เมื่อฉันกดแท็บในคอนโซลฉันได้รับผลลัพธ์นี้
แสดงความเป็นไปได้ทั้งหมด 2957 รายการ? (y หรือ n)
มีวิธีใดบ้างที่จะใช้grep
กับความเป็นไปได้เหล่านี้ 2957? ฉันต้องการค้นหาคำสั่งทั้งหมดด้วยคำว่า "svn" ในพวกเขา
เมื่อฉันกดแท็บในคอนโซลฉันได้รับผลลัพธ์นี้
แสดงความเป็นไปได้ทั้งหมด 2957 รายการ? (y หรือ n)
มีวิธีใดบ้างที่จะใช้grep
กับความเป็นไปได้เหล่านี้ 2957? ฉันต้องการค้นหาคำสั่งทั้งหมดด้วยคำว่า "svn" ในพวกเขา
คำตอบ:
การแก้ปัญหาคือ compgen
builtin หากต้องการ grep 'svn' จากคำสั่งที่มีอยู่ทั้งหมดและชื่อแทนคำสั่งที่สามารถเข้าถึงได้ผ่าน$PATH
พิมพ์
compgen -ac | grep svn
ต้องการค้นหาจากคำนำหน้าบางคำ (เช่นคำสั่งทั้งหมดที่ขึ้นต้นด้วยecrypt
) ใช่ไหม ใช้นิพจน์ทั่วไป .
compgen -ac | grep "^ecrypt"
compgen
คุณสามารถลองใช้
ตัวอย่างเช่น:
compgen -ac | grep "svn"
สิ่งนี้ควรมีความเสมอภาค:
for x in `echo $PATH | sed 's/:/ /g'`; do ls $x | grep svn; done
for i in $(echo $PATH | tr ":" "\n"); do find $i -type f -perm +111; done | grep svn
คล้ายกับคำตอบของ totaam นอกเหนือจากข้อ จำกัด นี้ขอบเขตของการปฏิบัติการ (ตามที่ Bash ทำ) แต่ JJE compgen
นั้นดีกว่าอีกหนึ่งไมล์
อาจจะ {,.}*svn*
ls -l /usr/bin/{,.}*svn*<tab>
ช่วยให้ที่นี่เช่น
แต่ดูที่ Zsh! ที่นี่: http://www.jukie.net/bart/blog/zsh-tab-completionเป็นตัวอย่างที่ดีว่าจะช่วยลดผลการเสร็จสิ้นแท็บของคุณได้อย่างไร ซึ่งรวมถึงการปฏิเสธเช่นหากคุณต้องการผลลัพธ์การเติมแท็บทั้งหมดโดยไม่มีคำว่า "foobar" หรือผลลัพธ์ทั้งหมดที่มีตัวเลขเป็นเลขคู่ตั้งแต่แรกแท็บไดเรกทอรีย่อยเสร็จสิ้นและอีกมากมาย เหตุผลที่ฉันเปลี่ยนเป็น zsh คือการแบ่งปันประวัติระหว่างเทอร์มินัลที่เปิดอยู่ทั้งหมด
ฉันไม่รู้จัก compgen และจะแนะนำ:
ls -d ${PATH//:/\/*svn* } 2>/dev/null
สำหรับทุบตี
${VAR//pattern/replace} replaces in VAR pattern with replace. // is used to replace every pattern, not just the first, which would be just /.