Linux の patch コマンドのソース コードはありますか?

Linux の patch コマンドのソース コードはありますか?

Linux で使用される patch コマンドのソース コードを探しています。入手可能かどうか知っている人はいますか?

POSIX、より具体的には QNX v7 と互換性のあるものを探しています。

答え1

patchコマンド の実装はいくつかあり、busyboxたとえば には独自のものが付属しています。おそらく、patchシステムに付属している のソース コードを探しているのでしょう。ソース コードを見つけるには、何を探しているのかを知っておく必要があります。どのパッケージがpatchコマンドを提供しているか、アップストリームがどこにあるかを確認する必要があります。使用している OS を指定していませんが、Debian では次のようにできます。

root@64ee32ea5ee6:/# dpkg -S "$(command -v patch)"
patch: /usr/bin/patch
root@64ee32ea5ee6:/# dpkg -s patch
Package: patch
Status: install ok installed
Priority: standard
Section: vcs
Installed-Size: 238
Maintainer: Ubuntu Developers <[email protected]>
Architecture: amd64
Multi-Arch: foreign
Version: 2.7.6-2ubuntu1.1
Depends: libc6 (>= 2.17)
Suggests: ed, diffutils-doc
Description: Apply a diff file to an original
 Patch will take a patch file containing any of the four forms
 of difference listing produced by the diff program and apply
 those differences to an original file, producing a patched
 version.
Homepage: http://savannah.gnu.org/projects/patch/
Original-Maintainer: Laszlo Boszormenyi (GCS) <[email protected]>

Slackware の場合の例:

$ grep $(sed 's,^/,,' <<< "$(command -v patch)" ) /var/log/packages/* | cut -d: -f1
/var/log/packages/metamail-2.7-x86_64-7
/var/log/packages/patch-2.7.6-x86_64-3
/var/log/packages/patchelf-0.10-x86_64-1
$ cat /var/log/packages/patch-2.7.6-x86_64-3
PACKAGE NAME:     patch-2.7.6-x86_64-3
COMPRESSED PACKAGE SIZE:     116K
UNCOMPRESSED PACKAGE SIZE:     290K
PACKAGE LOCATION: ./patch-2.7.6-x86_64-3.txz
PACKAGE DESCRIPTION:
patch: patch (apply a diff file to an original file or files)
patch:
patch: Patch is a utility used to apply diffs (or patches) to files, which
patch: are usually source code.
patch:
patch: Larry Wall wrote the original version of patch. Paul Eggert removed
patch: patch's arbitrary limits; added support for binary files, setting
patch: file times, and deleting files; and made it conform better to POSIX.
patch: Other  contributors include Wayne Davison, who added unidiff support,
patch: and David MacKenzie, who added configuration and backup support.
patch:

どちらの場合もGNUパッチが使用され、Debianパッケージの説明にはプロジェクトのホームページへのリンクも含まれています。 http://savannah.gnu.org/projects/patchしかし、現時点では機能していません。

patchまた、パッケージのメンテナーによって追加されたすべてのパッチとコメントを含む、現在システムで使用しているソースを取得したい場合もあります。Debian では次のように実行できます。

$ apt-get source patch

答え2

patch少なくともデフォルトのコマンドデビアン(ただし、おそらく他のほとんどの Linux ディストリビューションでも同様) は GNU ですpatch

GNUpatchプロジェクトの「ホームページ」はhttps://www.gnu.org/software/patch/

このページには、ソフトウェアリポジトリそしてダウンロード可能な配布アーカイブ

ソフトウェアリポジトリのGithubミラーは以下から入手可能です。https://github.com/mirror/パッチ

BSDシステムには代替実装があります。OpenBSD実装は以下で見ることができます。https://cvsweb.openbsd.org/src/usr.bin/patch/

答え3

Linuxを使っている場合は、おそらくGNU patchを使用しているでしょう。http://www.gnu.orgですが、patch長い歴史があり、複数のバリエーションが存在します。

patchは、1985 年 5 月に Larry Wall によって最初に書かれたプログラムです。 彼はバージョン1.3のソースをshar形式でUsenetニュースグループに投稿した。mod.sources

comp.sources.unixバージョン 2.0 は、1986 年に Larry Wall によって(後に名前が変更された)への投稿で公開されmod.sources、Larry Wall による最新バージョンは 1988 年 6 月に作成されました。

ラリーからの元のライセンスは次のとおりです。

* This program may be copied as long as you don't try to make any
* money off of it, or pretend that you wrote it.

これは、OSS から「利益を得る」ことを禁じているため、今日の OSS の考え方とは一致しません。

のように複雑なプログラムにはpatch注意が必要なので、派生バージョンがいくつかあります。

GNU の人々は 1990 年に GPLd バージョンを考案しましたが、私の知る限り、ラリー氏がこのライセンスの変更を承認したかどうかは確認されていません。

1990 年代には IBM、HP、DEC、Sun によるクローズド ソース バージョンが作成されました。POSIX 準拠になりましたが、既知のバグがすべて修正されたわけではありません。

約 10 年前、GPLd コードのないバリアントが OpenBSD と私によって作成されました。

約 5 年前、Larry は、パッチを OSS 準拠にするために、OpenBSD の人々と私に 1 条項 BSD ライセンスを使用する許可を与えました。

バグやセキュリティの問題に関して、BSD の人々と私の間では何らかのやり取りが行われていますが、GNU バージョンは別です。

バージョンにはschilytoolsパッチ用の高価なテスト スイートが含まれており、その結果を期待される結果やローカルにインストールされたバージョンの結果と比較します。これは (多くの場合 gpatch) であるため、システムにインストールされたバージョンでバグが検出されるたびに、何らかの回避策を含める必要があります ,-)

schilytools バージョンのマニュアル ページは、次の場所にあります。http://schilytools.sourceforge.net/man/man1/patch.1.html

OP が QNX に興味を持っていることを考えると、OpenBSD ソースは移植性がないために興味がありません。QNX コンパイルに対する最後のフィードバックが見られてから長い時間が経っていますが、schilytools は移植性が非常に高くなっています。したがって、QNX でコンパイルされなくなった場合は、ヒントを送ってください。

ところで、GNU パッチは POSIX の要件の一部と競合しています。

関連情報