斯蒂芬·基特(Stephen Kitt)的答案涵盖了什么,我将尝试说明实施此更改的原因。首先,有人发现包含换行符1的文件名可能导致输出不明确。例如,考虑以下输出:
d41d8cd98f00b204e9800998ecf8427e foo
25af89c92254a806b2e93fffd8ac1814 bar
这是否意味着有两个文件foo
和bar
,或者只有一个文件名是"foo\n25af89c92254a806b2e93fffd8ac1814 bar"
?当然,后一种可能性极不可能,但有可能。为了解决歧义,开发人员选择使用反斜杠(\
)换行。然后,输出变得可区分。但是,还有另一个歧义:
764efa883dda1e11db47671c4a3bbd9e foo\nbar
此文件的名称是否包含换行符或反斜杠后跟一个n
?为了解决这个问题,我们也需要转义反斜杠,以便后一种情况变为:
764efa883dda1e11db47671c4a3bbd9e foo\\nbar
最后,他们选择在包含此类转义的每条输出行之前加上a,\\
以使解析器易于检测是否已完成转义。大概这样做是为了允许解析器处理转义版本md5sum
和非转义版本(非GNU)的输出。该标志还意味着不需要时不必进行“代价高昂的”转义。您可以看到一个md5sum.c
本身进行解析的示例(链接版本中的第382行)。
1通过换行我的意思的字符\n
其有时也特别被称为换行或LF ; 见md5sum.c
。
*sum
实用程序(与md5sum
,例如e,gsha1sum
等相同)。