スティーブン・キットの答えは何をカバーしており、この変更がなぜ実装されたのかをカバーしようとします。最初に、改行1を含むファイル名があいまいな出力になる可能性があることを誰かが観察しました。たとえば、次の出力を検討してください。
d41d8cd98f00b204e9800998ecf8427e foo
25af89c92254a806b2e93fffd8ac1814 bar
これは、ファイルが2つfoo
ありbar
、ファイル名が1つだけのファイルがあることを意味します"foo\n25af89c92254a806b2e93fffd8ac1814 bar"
か?確かに、この後者の可能性はほとんどありませんが、可能です。あいまいさを解決するために、開発者はバックスラッシュ(\
)で改行をエスケープすることを選択しました。出力は区別可能になります。ただし、さらに曖昧さがあります。
764efa883dda1e11db47671c4a3bbd9e foo\nbar
このファイルの名前には改行が含まれていますn
か?これを解決するには、バックスラッシュもエスケープする必要があるため、後者の場合は次のようになります。
764efa883dda1e11db47671c4a3bbd9e foo\\nbar
最後に、このようなエスケープを含む各出力行の先頭にa \\
を付けて、パーサーがエスケープが行われたかどうかを簡単に検出できるようにしました。これはおそらく、パーサーがエスケープバージョンmd5sum
と非エスケープバージョン(非GNU)の両方からの出力を処理できるようにするために行われたものです。このフラグは、必要のないときに「コストのかかる」エスケープを解除する必要がないことも意味します。この解析md5sum.c
自体の動作の例を見ることができます(リンクされたバージョンの行382)。
1により改行 I文字意味\n
時には具体と呼ばれる改行またはLFを。をご覧くださいmd5sum.c
。
*sum
ユーティリティ(と同じファミリmd5sum
、たとえば、gsha1sum
など)も同じことを行います。