名前に "\"が含まれるファイルのチェックサムを見つけると、md5sumがチェックサムの前に "\"を追加するのはなぜですか?
$ md5sum /tmp/test\\test
\d41d8cd98f00b204e9800998ecf8427e /tmp/test\\test
他のすべてのユーティリティにも同様です。
答え1
これはファイルに書き込む、Coreutils の場合md5sum
:
もし文書バックスラッシュまたは改行文字を含み、行はバックスラッシュで始まり、ファイル名に問題があるすべての文字はバックスラッシュでエスケープされるため、任意のファイル名があっても出力はあいまいになりません。
(文書ファイルの内容ではなくファイル名です。)
b2sum
、sha1sum
、そして様々なSHA-2ツール動作はと同じですmd5sum
。sum
そしてcksum
いいえ。sum
以前のバージョンとの互換性のみを提供します(そしてその祖先は引用された出力を生成しません)。cksum
はい。POSIXで指定このタイプの出力は許可されません。
この行動は2015年11月発売バージョン 8.25 (2016 年 1 月) では、次の項目が含まれてリリースされましたNEWS
。
md5sum
次に、行の先頭に「\」を使用し、改行を「\ n」に置き換えて、各ファイルが標準出力にステータスを表示していることを確認してください。これは、にもsha1sum
影響しsha224sum
ます。sha256sum
sha384sum
sha512sum
行の先頭のバックスラッシュはフラグとして使用されます。ファイル名のエスケープは、行がバックスラッシュで始まる場合にのみ処理されます。 (エスケープ解除はデフォルトの動作ではありません。保存したファイル名を含める\\
か、保存した以前のバージョンのCoreutilsで生成された合計を破棄することができます。)\n
答え2
Stephen Kittの答えは次のとおりです。何カバーしてみましょう。なぜこの変更が実装されました。まず、改行文字1を含むファイル名が以下を引き起こす可能性があることが観察されました。あいまいな出力。たとえば、次の出力を考えてみましょう。
d41d8cd98f00b204e9800998ecf8427e foo
25af89c92254a806b2e93fffd8ac1814 bar
foo
これは2つのファイルとがあることを意味しますかbar
、それとも名前が1つのファイルだけであることを意味しますか"foo\n25af89c92254a806b2e93fffd8ac1814 bar"
?もちろん、後者の可能性はほとんどありませんが、可能です。あいまいさを解決するために、開発者はバックスラッシュ(\
)を使用して改行をエスケープすることにしました。これにより、出力が区別可能になります。しかし、もっと曖昧な点があります。
764efa883dda1e11db47671c4a3bbd9e foo\nbar
ファイル名に改行文字またはバックスラッシュの後に改行文字が含まれていますかn
?この問題を解決するには、バックスラッシュをエスケープする必要があります。その後、後者の場合は次のようになります。
764efa883dda1e11db47671c4a3bbd9e foo\\nbar
最後に、彼らはこれらのエスケープ文字を含むすべての出力行の前にを追加することにしました\\
。パーサー脱出が完了したことを確認してください。おそらく、これはパーサーがmd5sum
エスケープされたバージョンとエスケープされていない(非GNU)バージョンの両方の出力を処理できるようにするために行われたようです。このフラグはまた、必要でないときに「高価な」エスケープを必要としないことを意味します。この構文解析の例は次のとおりです。md5sum.c
自体(リンクされたバージョンの382行)。
1個新しいチーム私の言葉は\n
時々具体的に呼ばれます。改行またはもし;バラよりmd5sum.c
。