Ответ Стивена Китта охватывает вопрос « что?», И я постараюсь объяснить, почему это изменение было реализовано. Во-первых, кто-то заметил, что имя файла, содержащее перевод строки 1, может привести к неоднозначному выводу . Например, рассмотрим этот вывод:
d41d8cd98f00b204e9800998ecf8427e foo
25af89c92254a806b2e93fffd8ac1814 bar
Означает ли это, что было два файла fooи / barили только один файл с именем файла "foo\n25af89c92254a806b2e93fffd8ac1814 bar"? Конечно, эта последняя возможность крайне маловероятна, но она возможна. Чтобы устранить неоднозначность, разработчики решили экранировать символы новой строки с помощью обратной косой черты ( \). Выходной сигнал становится различимым. Однако тогда возникает еще одна двусмысленность:
764efa883dda1e11db47671c4a3bbd9e foo\nbar
Содержит ли имя этого файла символ новой строки или обратную косую черту с последующим n? Чтобы решить эту проблему, нам также необходимо избежать обратной косой черты, чтобы последний случай стал:
764efa883dda1e11db47671c4a3bbd9e foo\\nbar
Наконец, они решили добавить каждую выходную строку, содержащую такие экранированные символы, \\чтобы облегчить парсеру обнаружение выполнения экранирования. Предположительно это было сделано для того, чтобы парсеры могли обрабатывать выходные данные как из экранированных версий, так md5sumи из не экранированных версий (не-GNU). Этот флаг также означает, что «дорогостоящее» удаление не нужно делать, когда в этом нет необходимости. Вы можете увидеть пример этого анализа в действии md5sum.cсам по себе (строка 382 в связанной версии).
1 Под символом новой строки я подразумеваю символ, \nкоторый иногда также конкретно называют переводом строки или LF ; см md5sum.c.
*sumутилиты (того же семейства, чтоmd5sumи e, g иsha1sumт. Д.) В GNU coreutils делают то же самое.