Ответ Стивена Китта охватывает вопрос « что?», И я постараюсь объяснить, почему это изменение было реализовано. Во-первых, кто-то заметил, что имя файла, содержащее перевод строки 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 делают то же самое.