md5sum コマンドのバイナリとテキストモード

md5sum コマンドのバイナリとテキストモード

GNUmd5sumコマンドには2つのモードがあります。バイナリモードとテキストモデル。違いは改行文字の処理方法だと思います。私は正しいですか?

GNU / Linuxでは、両方のモードは常に同じ結果を生成するため、オプションの唯一の目的は、ファイル名(または)の-b前に使用されるフラグを表すことです。-t*

どのような状況で、これらのパターンは異なる結果をもたらしますか? Windows / MacOSシステムを使用していますか? (これらのプラットフォームで利用可能なバージョンはありますか?)

答え1

GNU / Linuxでは、両方のモードは常に同じ結果を生成します。

はい、明示的に。からman md5sum

メモ:[sic] GNUシステムでは、バイナリモードオプションとテキストモードオプションの間に違いはありません。

これは、md5sumGNU coreutils 8.21に付属の実装から来ています。以前のバージョン(8.12)にはこの通知がないことがわかりましたが、とにかくそうすると思います。

AFAICTはmd5sum正式に標準化されていませんが(POSIXを介して)、さまざまな実装を介してさまざまなプラットフォームで利用可能であり、システム全体で簡単に使用できるように、これらのプラットフォームを互いに互換性にするには明らかに少しの努力が必要です。

これに関して、ISO/ANSI C規格ファイルアクセス用の高度なストリーミング機能が含まれています。これは、標準の一部として共有ライブラリまたはコンパイラを介してISO Cを実装するすべてのオペレーティングシステムで使用できます。この機能はほとんどすべてのオペレーティングシステムで利用可能なので(それ自体はCで書かれることが多い)、移植性に優れたソフトウェアを実装するための汎用言語です。

md5sumその機能を考慮すると、すべてのオペレーティングシステムでコンパイルして実行されるプログラムを書くことが完全に可能です。 GNU coreutilsバージョンでも同様であるとは言いませんが、前述の上位レベルのファイルストリーム機能の1つは、fopen()ISO Cでファイルを開くスイッチを含むb「ファイルを開く」を表示する必要があることです。バイナリファイルとして」。これが意味するものまたはシステム要件は何ですか?いいえ標準では一部(どの)の理由。

linux / POSIX / * nixスタイルのオペレーティングシステムにはそのような理由がないため、このスイッチは何もしません。 POSIX仕様(ISO Cの上位セット)から開いている():

文字「b」は無効ですが、ISO C規格に準拠することは許可されています。

したがってmd5sum、ISO Cのファイルにアクセスする他の方法がないため、完全に移植可能な実装ではISO上位レベルのファイルストリーム機能を使用できます(POSIX準拠のプラットフォームを含むほとんどのプラットフォームにも独自の下位レベルの方法がありますが、これらのメソッドはISO Cないため、移植性がなく、-bファイルを読み取るときにオプションを追加または-t追加しないようにフラグも実装する必要がありますbfopen()

繰り返しますが、GNUのmd5sumが完全に移植可能な方法で書かれているか派生しているとは言いません。しかし、明らかに操作性の点でこの方法に固執しようとしています。何もしないフラグがあるものとないのは違います。前者の場合は実行するように指定されていますが、何もしませんが、後者の場合はこれを使用するとエラーが発生したり原因になる可能性があります。未定義の動作

答え2

他の人が指摘したように、GNUシステムと最新のWindowsでは、これらのオプションは効果がありません。

ソースコードを見ると、md5sumファイルで使用されるときにtext / binaryオプションがmodeorで使用される引数を決定します。すべてのPOSIX互換システムでは無視され、何の効果もありません。fopen(const char *pathname, const char *mode)"r""rb"b

md5sum標準入力を読み込むと、デフォルトでcoreutilsテキストモードに設定されます。次の条件がすべて真の場合のみ:

  • コンパイル時マクロが定義されますO_BINARY(つまり、テキストモードとバイナリモードの間に違いがあります)。
  • 入力は端末から来ます
  • そして、モードはコマンドラインオプションによって無視されません。

それ以外の場合は、バイナリモードが想定され(コマンドラインオプションでオーバーライドされない限り)、定義されているO_BINARY場合はxset_binary_mode()標準入力に対して呼び出されます。

xset_binary_mode()はいxbinary-io.hで定義されたラッパーですgnulib定義されていない場合はO_BINARY仮想関数になり、良いCコンパイラであればそれを最適化します。したがって、関数が何らかの理由で呼び出されても、テキストとバイナリは何の効果もありません。

ただし、O_BINARY定義されると、次で宣言されたxset_binary_mode()ラッパーになります。set_binary_mode()binary-io.h~のgnulib。ここでは、「バイナリモード」が実際に影響を与えるプログラミング環境の最初の手がかりを見つけることができます。

#if O_BINARY
# if defined __EMX__ || defined __DJGPP__ || defined __CYGWIN__
#  include <io.h> /* declares setmode() */
#  define __gl_setmode setmode
# else
#  define __gl_setmode _setmode
#  undef fileno
#  define fileno _fileno
# endif
#else
  /* On reasonable systems, binary I/O is the only choice.  */
  /* Use a function rather than a macro, to avoid gcc warnings
     "warning: statement with no effect".  */
BINARY_IO_INLINE int
__gl_setmode (int fd _GL_UNUSED, int mode _GL_UNUSED)
{
  return O_BINARY;
}
#endif

確かに、 __EMX__はいエバーハルトマテスeXtender、MS-DOSおよびOS / 2用の32ビットモードプログラミング環境です。同様に__DJGPP__、以下を指します。MS-DOS用DJGPP 32ビット開発システム。そしてそこにシビン。これらのプログラミング環境setmode()はすべて<io.h>

O_BINARY他の定義されたプログラミング環境の場合_setmode()(そのプログラミング環境によって定義される)が使用される。

OpenVMSは、テキストモードとバイナリモードのオペレーティングシステムの重要な例の1つです。また、テキストを単純な文字ストリームとして保存するUnixスタイルの方法も知っています。 OpenVMSの世界ではこれを明確に呼びますStream_LF。特定の名前があるという事実は、テキストファイルをフォーマットする唯一の方法ではありません

気になる方のために:http://neilrieck.net/docs/openvms_notes_text_files.html

要約すると、OpenVMSでは、non-stream simple textファイル形式には、ファイルメタデータで定義されている最大サイズ(最大32767バイト)を含むゼロ個以上のレコード(行)が含まれます。各行には、各行のバイト数を表す16ビット値が接頭辞で付けられます。 「行末」文字のようなものはありません。指定されたバイト数を読み取ると行が終了します。 1行のバイト数が奇数の場合、次の行の先頭がワードでソートされたアドレス0x00になるようにパディングバイトが追加されます。このパディングバイトは行の長さには含まれません。

GNU Coreutilsは実際にOpenVMSに移植されました。

答え3

ちなみにWindowsでも計算やモードに違いがないという情報を追加したいと思いますmd5sum。 Windows用(GNU coreutils)8.31でテストされました。--text--binarymd5sum

c:\temp\file-fingerprint-test\work-copy1\file-fingerprint-eol (master -> origin)
2021-05-30 - 7:35:52 PM
λ xxd unix-eol.txt
00000000: 7468 6973 2066 696c 6520 6861 7320 756e  this file has un
00000010: 6978 206c 696e 6520 656e 6469 6e67 730a  ix line endings.
00000020: 7468 6973 206d 6561 6e20 6974 2068 6173  this mean it has
00000030: 206f 6e6c 7920 4c46 0a                    only LF.

c:\temp\file-fingerprint-test\work-copy1\file-fingerprint-eol (master -> origin)
2021-05-30 - 7:36:08 PM
λ xxd win-eol.txt
00000000: 7468 6973 2066 696c 6520 6861 7320 7769  this file has wi
00000010: 6e20 206c 696e 6520 656e 6469 6e67 730d  n  line endings.
00000020: 0a74 6869 7320 6d65 616e 2069 7420 6861  .this mean it ha
00000030: 7320 2020 4352 204c 460d 0a              s   CR LF..

c:\temp\file-fingerprint-test\work-copy1\file-fingerprint-eol (master -> origin)
2021-05-30 - 7:36:15 PM
λ md5sum.exe --text *.txt
c8a8c7bb97ab554cff96a76b2a8f89fa  unix-eol.txt
03b3b1458cddff2cf1c15819b1255af3  win-eol.txt

c:\temp\file-fingerprint-test\work-copy1\file-fingerprint-eol (master -> origin)
2021-05-30 - 7:36:46 PM
λ md5sum.exe --bin *.txt
c8a8c7bb97ab554cff96a76b2a8f89fa *unix-eol.txt
03b3b1458cddff2cf1c15819b1255af3 *win-eol.txt

c:\temp\file-fingerprint-test\work-copy1\file-fingerprint-eol (master -> origin)
2021-05-30 - 7:36:57 PM
λ md5sum.exe --version
md5sum (GNU coreutils) 8.31
Copyright (C) 2019 Free Software Foundation, Inc.
License GPLv3+: GNU GPL version 3 or later <https://gnu.org/licenses/gpl.html>.
This is free software: you are free to change and redistribute it.
There is NO WARRANTY, to the extent permitted by law.

Written by Ulrich Drepper, Scott Miller, and David Madore.

関連情報