Jawaban Stephen Kitt mencakup apa dan saya akan mencoba membahas mengapa perubahan ini diterapkan. Pertama, seseorang mengamati bahwa nama file yang mengandung baris baru 1 dapat menghasilkan output yang ambigu . Sebagai contoh, pertimbangkan output ini:
d41d8cd98f00b204e9800998ecf8427e foo
25af89c92254a806b2e93fffd8ac1814 bar
Apakah ini berarti ada dua file foo
dan bar
, atau hanya satu file yang memiliki nama file "foo\n25af89c92254a806b2e93fffd8ac1814 bar"
? Memang, kemungkinan yang terakhir ini sangat tidak mungkin, tetapi itu mungkin. Untuk mengatasi ambiguitas, pengembang memilih untuk keluar dari baris baru dengan backslash ( \
). Output kemudian menjadi dapat dibedakan. Namun, kemudian ada ambiguitas lebih lanjut:
764efa883dda1e11db47671c4a3bbd9e foo\nbar
Apakah nama file ini mengandung baris baru, atau garis miring terbalik diikuti oleh n
? Untuk mengatasi ini, kita juga harus melarikan diri dari garis miring terbalik, sehingga kasus terakhir menjadi:
764efa883dda1e11db47671c4a3bbd9e foo\\nbar
Akhirnya, mereka memilih untuk mendahului setiap jalur keluaran yang berisi pelarian seperti itu dengan a \\
untuk memudahkan pengurai mendeteksi apakah pelolosan telah dilakukan. Agaknya hal ini dilakukan untuk memungkinkan parser menangani keluaran baik dari versi yang lolos md5sum
dan dari versi yang tidak lolos (non-GNU). Bendera juga berarti bahwa "mahal" un-melarikan diri tidak perlu dilakukan ketika tidak perlu. Anda dapat melihat contoh tindakan parsing ini md5sum.c
sendiri (baris 382 dalam versi tertaut).
1 Dengan baris baru yang saya maksud adalah karakter \n
yang kadang-kadang juga secara khusus disebut sebagai linefeed atau LF ; lihat md5sum.c
.
*sum
utilitas lain (dari keluarga yang sama denganmd5sum
, e, g,sha1sum
dll.) Di GNU coreutils melakukan hal yang sama.