โอเคพลเมือง ดังนั้นฉันจึงยอมรับขีดจำกัดความยาวบรรทัดคำสั่งเป็นพระกิตติคุณมาระยะหนึ่งแล้ว แล้วจะทำอย่างไรกับสมมติฐานของตน? ตรวจสอบตามธรรมชาติ
ฉันมีเครื่อง Fedora 22 พร้อมจำหน่าย (หมายถึง: Linux พร้อม bash4) ฉันได้สร้างไดเร็กทอรีที่มี 500,000 inodes (ไฟล์) ในแต่ละไฟล์มีความยาว 18 อักขระ ความยาวบรรทัดคำสั่งคือ 9,500,000 อักขระ สร้างขึ้นดังนี้:
seq 1 500000 | while read digit; do
touch $(printf "abigfilename%06d\n" $digit);
done
และเราทราบ:
$ getconf ARG_MAX
2097152
อย่างไรก็ตามโปรดทราบว่าฉันสามารถทำได้:
$ echo * > /dev/null
แต่สิ่งนี้ล้มเหลว:
$ /bin/echo * > /dev/null
bash: /bin/echo: Argument list too long
ฉันสามารถเรียกใช้ลูป:
$ for f in *; do :; done
ซึ่งเป็นเปลือกหอยอื่นในตัว
อ่านระมัดระวังของเอกสารสำหรับARG_MAX
รัฐ, ความยาวสูงสุดของการโต้แย้งกับการทำงาน exec ซึ่งหมายความว่า: โดยไม่ต้องโทรexec
ก็ไม่มีARG_MAX
ข้อ จำกัด ดังนั้นจึงจะอธิบายว่าทำไม builtins เปลือกจะไม่ถูก จำกัด ARG_MAX
โดย
และแน่นอนฉันสามารถls
ไดเร็กทอรีของฉันได้หากรายการอาร์กิวเมนต์ของฉันยาว 1,09948 ไฟล์หรือประมาณ 2,089,000 อักขระ (ให้หรือรับ) เมื่อฉันเพิ่ม 18 ตัวอักษรไฟล์อีกหนึ่งชื่อไฟล์ แต่แล้วฉันจะได้รับรายการอาร์กิวเมนต์ยาวเกินไปข้อผิดพลาด ดังนั้นARG_MAX
คือการทำงานตามที่โฆษณา: exec มีความล้มเหลวที่มีมากกว่าARG_MAX
ตัวอักษรบนอาร์กิวเมนต์ list- รวมทั้งก็ควรจะตั้งข้อสังเกตข้อมูลสภาพแวดล้อม