ภาวะแทรกซ้อน
บางครั้งต่อไปนี้จะใช้งานได้:
gzip -d `cat large_file_list`
สามปัญหาคือ (ในbash
และเชลล์คล้าย Bourne อื่น ๆ ):
มันจะล้มเหลวหากชื่อไฟล์ใด ๆ มีแท็บที่ว่างหรืออักขระขึ้นบรรทัดใหม่ (สมมติ$IFS
ว่าไม่ได้มีการแก้ไข) นี้เป็นเพราะเปลือกแยกคำ
นอกจากนี้ยังมีแนวโน้มที่จะล้มเหลวหากชื่อไฟล์ใด ๆ มีอักขระแบบแอคทีฟกลมอยู่ภายใน นี่เป็นเพราะเชลล์จะใช้การขยายชื่อพา ธกับรายการไฟล์
นอกจากนี้ยังจะล้มเหลวถ้าชื่อไฟล์ที่เริ่มต้นด้วย-
(ถ้าPOSIXLY_CORRECT=1
ที่ใช้เฉพาะกับไฟล์แรก) หรือถ้าชื่อไฟล์ใด ๆ -
ที่เป็น
นอกจากนี้ยังจะล้มเหลวหากมีชื่อไฟล์มากเกินไปเพื่อให้พอดีกับบรรทัดคำสั่งเดียว
รหัสด้านล่างอาจมีปัญหาเช่นเดียวกับรหัสข้างต้น (ยกเว้นที่สี่)
for file in `cat large_file_list`
do
gzip -d $file
done
ทางออกที่เชื่อถือได้
หากคุณlarge_file_list
มีชื่อไฟล์หนึ่งชื่อต่อหนึ่งบรรทัดอย่างแน่นอนและไฟล์ที่เรียก-
ว่าไม่ได้อยู่ในชื่อเดียวกันและคุณอยู่ในระบบ GNU ให้ใช้:
xargs -rd'\n' gzip -d -- <large_file_list
-d'\n'
บอกxargs
ให้ถือว่าแต่ละบรรทัดของการป้อนข้อมูลเป็นชื่อไฟล์แยกต่างหาก
-r
บอกxargs
ไม่ให้รันคำสั่งหากไฟล์อินพุตว่างเปล่า
--
บอกว่าข้อโต้แย้งต่อไปนี้จะไม่ได้ที่จะถือว่าเป็นตัวเลือกแม้ว่าพวกเขาจะเริ่มต้นด้วยgzip
อยู่คนเดียวจะยังคงได้รับการปฏิบัติเป็นแทนของไฟล์ที่เรียกว่า-
-
-
-
xargs
จะใส่ชื่อไฟล์จำนวนมากในแต่ละบรรทัดคำสั่ง แต่จะไม่มากจนเกินขีด จำกัด บรรทัดคำสั่ง สิ่งนี้ช่วยลดจำนวนครั้งที่gzip
กระบวนการต้องเริ่มต้นและทำให้รวดเร็ว นอกจากนี้ยังเป็นที่ปลอดภัย: ชื่อไฟล์นี้จะถูกป้องกันจากแยกคำและการขยายตัวของพา ธ
gzip
ระบบของคุณจำนวนไฟล์ในรายการไฟล์และขนาดของไฟล์เหล่านั้น