Ruby 4.1 リファレンスマニュアル

Win32ネイティブ版Rubyの互換性問題

[edit]

Win32ネイティブ版Rubyは、できる限りUnix版と同等の動作をするように意図して作られていますが、 OS自体の制限などにより、いくつかの非互換性があります。また、実装上の制限・バグもいくつか残っているようです。

注意: このドキュメントは現状では不充分です。気づいたことのあるひとはどんどん書き足してください。

プロセスの扱い

最も重要な違いとして、fork が動作しないことがあげられます。Process.fork は NotImplementedError を発生させます。Unix向けに書かれているデーモン系のアプリケーションが動かないのはこれが原因であることが多いでしょう。

実行権限の扱い

setuid などのプロセスの実行権限を変更するメソッドは、Windows に対応する機能が無いため NotImplementedError を発生させます。

ファイルシステムの問題

Win32のファイルストリームにはテキストモードとバイナリモードの区別が存在します。何も考えずに "w" などのモードでファイルに出力すると、\n → \r\n 変換が起きるために、バイナリデータが破壊されるという問題が起きます。バイナリデータを扱うときは "wb" のようにバイナリモードで開くか、IO#binmode を呼んでください。

File.chmod は読み出し許可・書き込み許可属性のみ操作できます。group/other に対する操作や実行許可の操作は無視されます。File.chown や File.lchown はエラーを返しませんが実際には何も行いません。

ドライブレターの扱いについては DOSISH 対応 (歴史的資料)も参照してください。

Ruby 4.1 では、Windows 10 1703 以降で 260 文字を超えるパスを扱うために LongPathsEnabled レジストリ値を設定する必要がなくなりました。ただし、パスの各要素は 255 文字までで、子プロセスは MAX_PATH の制限があるカレントディレクトリで開始されます。[bug#18947]

シェルの違いによる問題

Win32 ネイティブ版では、Kernel?.system などでシェル経由で外部コマンドを起動するときのシェルは cmd.exe です。シェルの文法や組み込みコマンドは Unix のシェルとは異なります。