パッチコマンド出力 "パッチが行の途中で予期せず終了しました。"

パッチコマンド出力 "パッチが行の途中で予期せず終了しました。"

diff および patch コマンドをスクリプトとして作成しようとしています。ご使用いただくと、bzcatこのような警告ウィンドウが表示されます。

# bzcat consolidated.patch.tar.bz2 | patch -d dev -p1 
  patch unexpectedly ends in middle of line
  patch unexpectedly ends in middle of line
# echo $?
  0

解凍したファイルを使用してパッチを適用すると、そのような警告は発生しません。

# tar -xf consolidated.patch.tar.bz2
# patch -d dev -p1 < consolidated.patch
# echo $?
  0

結果フォルダを比較しましたが、どちらの方法も同じです

# diff -aurN dev1 dev2 > res.diff
# stat res.diff 
  File: res.diff
  Size: 0           Blocks: 0          IO Block: 4096   regular empty file

答え1

ファイル名とファイルがで始まるという事実によると、tarファイルはconsolidated.patch.tar.bz2bzip2を使用して圧縮されたtarアーカイブです。ファイルを一緒に貼り付けて1つのツールで圧縮できるzipアーカイブとは異なりますが、ファイルを集計するステップ(tar)とバッチを圧縮するステップ(bzip2)が異なります。 (スマート実装はtar一般的な圧縮ツールを知って自動的に実行できることを除いて)

したがって、アーカイブされたファイルの代わりにbzcat圧縮されていないtarアーカイブが取得されます。ファイルが1つだけ含まれている場合も同様です。奇妙なことに、私はpatchそれを読むことができません。

GNU tarを使用すると、(少なくとも)-O/オプションを使用して--to-stdoutファイルデータをstdoutに送信できます。

tar -xj -f consolidated.patch.tar.bz2 -O | patch

(または... -O consolidated.patch唯一のファイルでない場合は、そのファイルを出力してください。)

ファイルが1つしかない場合は、実際にはこの手順は不要で、tarファイルを使用せずに圧縮できます。tarを使用してbzip2 consolidated.patchファイルを作成し、作業consolidated.patch.bz2bzcat続行できます。

関連情報