มีสูงสุดในการขยายชื่อไฟล์ทุบตี (globbing) และถ้าเป็นเช่นนั้นมันคืออะไร?


11

มีสูงสุดในการขยายชื่อไฟล์ทุบตี (globbing) และถ้าเป็นเช่นนั้นมันคืออะไร? ดูglobbingใน tldp.org

สมมติว่าฉันต้องการเรียกใช้คำสั่งกับชุดย่อยของไฟล์:

grep -e bar foo*
rm -f bar*

มีข้อ จำกัด ว่าจะขยายไฟล์ไปยังจำนวนเท่าใดและถ้าเป็นเช่นนั้นจะเป็นอย่างไร

ฉันไม่ได้มองหาวิธีอื่นในการดำเนินการเหล่านั้น (เช่นโดยใช้find)



2
ดูเพิ่มเติม: กำหนดขนาดสูงสุดสำหรับอาร์กิวเมนต์คำสั่งเดียวคืออะไร บนระบบ Linux ปัจจุบันมีข้อ จำกัด ที่แตกต่างกันสำหรับขนาดของอาร์กิวเมนต์เดียวและสำหรับขนาดทั้งหมด หลังขึ้นอยู่กับขีด จำกัด ขนาดสแต็ก
ilkkachu

คำตอบ:


17

ไม่มีข้อ จำกัด (นอกเหนือจากหน่วยความจำที่มี) ไปยังจำนวนไฟล์ที่อาจถูกขยายโดยbashglob

อย่างไรก็ตามเมื่อไฟล์เหล่านั้นถูกส่งผ่านเป็นอาร์กิวเมนต์ไปยังคำสั่งที่ดำเนินการ (ตรงข้ามกับ shell builtin หรือฟังก์ชั่น) จากนั้นคุณอาจพบข้อ จำกัด ของการexecve()เรียกระบบในบางระบบ ในระบบส่วนใหญ่การเรียกของระบบนั้นมีข้อ จำกัด เกี่ยวกับขนาดที่สะสมของข้อโต้แย้งและสภาพแวดล้อมที่ส่งผ่านไปและใน Linux ยังมีข้อ จำกัด แยกต่างหากเกี่ยวกับขนาดของข้อโต้แย้งเดียว

สำหรับรายละเอียดเพิ่มเติมดู:

เพื่อหลีกเลี่ยงข้อ จำกัด นั้นคุณสามารถใช้ (สมมติว่า GNU xargsหรือเทียบเท่า):

printf '%s\0' foo* | xargs -r0 rm -f

ด้านบนเนื่องจากprintfเป็นแบบในตัว (ในbashและเชลล์แบบบอร์นส่วนใหญ่) เราจึงไม่ถึงexecve()ขีด จำกัด และxargsจะแยกรายการของข้อโต้แย้งออกเป็นrmคำร้องได้มากเท่าที่ต้องการเพื่อหลีกเลี่ยงexecve()ข้อ จำกัด

ด้วยzsh:

autoload zargs
zargs foo* -- rm -f

ด้วยksh93:

command -x rm -f foo*

7

คุณสามารถดูข้อ จำกัด สำหรับขนาดทั้งหมดของอาร์กิวเมนต์ด้วย:

getconf ARG_MAX

สิ่งนี้ถูกกำหนดโดยทั่วไปไม่ใช่โดยเชลล์ แต่โดยระบบปฏิบัติการพื้นฐานตามคำตอบนี้


2
ฉันคิดว่ามันมีความยาวทั้งหมดไม่ใช่ตัวเลขใช่มั้ย
ilkkachu

1
คุณถูกต้องแน่นอน ฉันได้อัปเดตคำตอบเพื่อสะท้อนสิ่งนี้แล้ว ด้วยเหตุนี้การ จำกัด จำนวนอาร์กิวเมนต์จะเป็นฟังก์ชันของความยาวของอาร์กิวเมนต์
DopeGhoti
โดยการใช้ไซต์ของเรา หมายความว่าคุณได้อ่านและทำความเข้าใจนโยบายคุกกี้และนโยบายความเป็นส่วนตัวของเราแล้ว
Licensed under cc by-sa 3.0 with attribution required.