Odpowiedź Stephena Kitta obejmuje to, co postaram się wyjaśnić, dlaczego wprowadzono tę zmianę. Po pierwsze, ktoś zauważył, że nazwa pliku zawierająca nowy wiersz 1 może powodować niejednoznaczne wyniki . Rozważmy na przykład:
d41d8cd98f00b204e9800998ecf8427e foo
25af89c92254a806b2e93fffd8ac1814 bar
Czy to oznacza, że były dwa pliki foo
i bar
czy tylko jeden plik, którego nazwa pliku to "foo\n25af89c92254a806b2e93fffd8ac1814 bar"
? To prawda, że ta ostatnia możliwość jest wysoce nieprawdopodobna, ale jest możliwa. Aby rozwiązać niejednoznaczność, programiści postanowili uciec od nowego wiersza za pomocą odwrotnego ukośnika ( \
). Dane wyjściowe stają się następnie rozróżnialne. Istnieje jednak dalsza dwuznaczność:
764efa883dda1e11db47671c4a3bbd9e foo\nbar
Czy nazwa tego pliku zawiera znak nowej linii, czy odwrotny ukośnik, a po nim znak n
? Aby rozwiązać ten problem, musimy również uciec z ukośników odwrotnych, aby ten drugi przypadek stał się:
764efa883dda1e11db47671c4a3bbd9e foo\\nbar
Na koniec postanowili wstawić do każdego wiersza wyjściowego, który zawiera takie znaki ucieczki, \\
aby ułatwić analizatorowi parserowi wykrycie, czy zostało to wykonane. Prawdopodobnie zostało to zrobione, aby umożliwić parserom obsługę danych wyjściowych zarówno z wersji uciekających, jak i z wersji md5sum
nie-uciekających (innych niż GNU). Flaga oznacza również, że „kosztownego” ucieczki nie trzeba wykonywać, gdy nie jest to konieczne. Możesz zobaczyć przykład tego parsowania w akcji md5sum.c
sam w sobie (wiersz 382 w wersji połączonej).
1 Dzięki nowej linii mam na myśli postać \n
, która jest czasami również specjalnie określany jako wysuw wiersza lub LF ; zob md5sum.c
.
*sum
narzędzia (z tej samej rodziny comd5sum
, e, gsha1sum
itp.) W jądrach GNU robią to samo.