คำตอบของ Stephen Kitt ครอบคลุมถึงสิ่งที่และฉันจะพยายามอธิบายว่าทำไมการเปลี่ยนแปลงนี้จึงถูกนำไปใช้ ครั้งแรกที่มีคนตั้งข้อสังเกตว่าชื่อไฟล์ที่มีการขึ้นบรรทัดใหม่1อาจส่งผลให้การส่งออกที่ไม่ชัดเจน ตัวอย่างเช่นพิจารณาผลลัพธ์นี้:
d41d8cd98f00b204e9800998ecf8427e foo
25af89c92254a806b2e93fffd8ac1814 bar
นี้ไม่ได้หมายความว่ามีสองไฟล์foo
และbar
หรือเฉพาะไฟล์ที่มีชื่อไฟล์เป็น"foo\n25af89c92254a806b2e93fffd8ac1814 bar"
? จริงอยู่ที่ความเป็นไปได้หลังนี้ไม่น่าจะสูง แต่เป็นไปได้ เพื่อแก้ไขความคลุมเครือนักพัฒนาเลือกที่จะหลบเลี่ยงการขึ้นบรรทัดใหม่ด้วยแบ็กสแลช ( \
) จากนั้นผลลัพธ์จะกลายเป็นความแตกต่าง อย่างไรก็ตามมีความคลุมเครือเพิ่มเติม:
764efa883dda1e11db47671c4a3bbd9e foo\nbar
ชื่อไฟล์นี้มีการขึ้นบรรทัดใหม่หรือแบ็กสแลชตามด้วยn
หรือไม่ ในการแก้ไขปัญหานี้เราจำเป็นต้องหลบหลีกแบ็กสแลชด้วยดังนั้นกรณีหลังจะกลายเป็น:
764efa883dda1e11db47671c4a3bbd9e foo\\nbar
ในที่สุดพวกเขาเลือกที่จะเพิ่มแต่ละบรรทัดเอาต์พุตที่มี escapes ดังกล่าวด้วย\\
เพื่อให้ง่ายต่อการแยกวิเคราะห์เพื่อตรวจสอบว่าการหลบหนีได้ทำไปแล้วหรือไม่ สันนิษฐานว่าเป็นการกระทำเพื่ออนุญาตให้ตัวแยกวิเคราะห์จัดการเอาต์พุตทั้งจากรุ่นที่กำลังหนีmd5sum
และจากรุ่นที่ไม่หนีหาย (ไม่ใช่ GNU) การตั้งค่าสถานะยังหมายความว่าไม่จำเป็นต้องยกเลิกการ "หนีค่าใช้จ่าย" เมื่อไม่จำเป็น คุณสามารถดูตัวอย่างของการแยกวิเคราะห์นี้ในmd5sum.c
ตัวมันเอง (บรรทัด 382 ในเวอร์ชันที่ลิงก์)
1โดยการขึ้นบรรทัดใหม่ฉันหมายถึงอักขระ\n
ที่บางครั้งเรียกว่าlinefeedหรือLF โดยเฉพาะ เห็นmd5sum.c
ไหม
*sum
สาธารณูปโภคอื่น ๆ(ของตระกูลเดียวกันกับmd5sum
, e, g,sha1sum
ฯลฯ ) ใน GNU coreutils ทำเช่นเดียวกัน