POSIXの大失敗 〜 cpio vs tar戦争を平和に導くためにpaxコマンドを作った結果

## はじめに

みなさんは [pax](https://pubs.opengroup.org/onlinepubs/9699919799/utilities/pax.html) というコマンドをご存知でしょうか？ portable archive interchange の略で POSIX で標準化されているだけではなく POSIX 主導で開発された珍しいコマンドです。機能としては `tar` コマンドとかぶっています。実は今は `tar` コマンドは POSIX で標準化されていません。また同じく機能がかぶっている `cpio` コマンドも標準化されていません。`tar` コマンドと `cpio` コマンドはどちらも Unix を開発した AT&T で開発されたコマンドで当時の時点でどちらもそれなりに使われていたようです。

**POSIX は1992年に `tar` コマンドと新しく開発した `pax` コマンドを標準化しましたが、POSIX.1-2001 で `tar` を削除し `pax` に移行せよと各ベンダーとユーザーに促しました**。この POSIX の無謀としか思えない試みは、案の定失敗に終わっています（だって誰も使ってませんよね？）。一体当時何が起きてどうしてこうなってしまったのかを詳しく調べてまとめました。

**TL;DR** 長い記事を読みたくない人のための[ざっくり分かるまとめ](#まとめ)はこちら

**おまけ** [toybox roadmap](http://landley.net/toybox/roadmap.html) より

> The "pax" utility failed to replace tar, 

## pax とはなにか？

`pax` は `tar` や `cpio` の代わりとして使えるためのアーカイバですが、interchange （交換）という言葉が示す通りアーカイバの形式を交換するために設計されたコマンドです。`pax` コマンド一つで ustar 形式（tar と互換性がある拡張形式） や cpio 形式など複数の形式を扱うことができます。対応形式は拡張することが可能なように設計されており、POSIX.1-2001 (IEEE Std 1003.1-2001) からは新しく pax 形式が追加されました。実装ベンダーによっては POSIX では規定されていないその他の形式にも対応しています。一言で言えば pax コマンドは「**複数のアーカイブ形式に対応可能なように設計されたアーカイバ**」ということです。

補足しますと `tar` コマンド も `cpio` コマンドも（実装によりますが）複数の形式に対応しています。例えば Ubuntu 20.04 の GNU 版 `tar` コマンドは ustar 形式や pax 形式に対応しており、GNU 版 `cpio` は ustar 形式に対応しています。同様に BSD 版も複数の形式に対応しています。事実上 `pax` コマンドと出来ることは変わりません。しかし元々は `tar` コマンドが対応するのは tar 形式のみ、`cpio` コマンドが対応するのは cpio 形式のみです。つまり多くの `tar` コマンドや `cpio` コマンドの実装は（本来の範囲を超えて）「**複数のアーカイブ形式に対応するように進化したアーカイバ**」ということです。

## GNU tar が対応するファイル形式

少し話がそれますが、理解を助けるために GNU tar が対応しているファイル形式の話をします。（参考 [GNU tar -  Controlling the Archive Format](https://www.gnu.org/software/tar/manual/html_node/Formats.html)）

| 名前        | ファイル形式（登場時期）    | サイズ | ファイル名 | 備考                |
| ----------- | --------------------------- | ------ | ---------- | ------------------- |
| v7          | Version 7 Unix (1979)       | 8 GB   | 99         |                     |
| ustar       | POSIX 1003.1-1988 (1988)    | 8 GB   | 256        | GNU tar 1.14 で対応 |
| oldgnu      | GNU tar <= 1.12   (1999-06) | 無制限 | 無制限     |                     |
| gnu         | GNU tar >= 1.13.x (1999-07) | 無制限 | 無制限     |                     |
| pax (posix) | POSIX 1003.1-2001 (2001)    | 無制限 | 無制限     | GNU tar 1.14 で対応 |

補足 GNU tar のメジャーリリース は 1.14 (2004-05)

最初の tar コマンドの登場は 1979 年で Version 7 Unix で初めて実装されました。[Version 7 Unix のマニュアル](http://man.cat-v.org/unix_7th/1/) には `tar` コマンドがあります（ちなみに `cpio` コマンドはありません）。この時の形式が GNU tar では v7 形式と呼ばれています。

POSIX 1003.1-1988 で tar 形式を拡張した ustar 形式が登場します。最大のファイル名の文字数は増えていますが、最大ファイルサイズが 8GB であるという制限がありました。この ustar 形式は POSIX.2 で登場した `pax` コマンドで扱うことができます。（上記の表は ustar "形式" が登場した時期を書いていることに注意してください）

GNU tar の開発が開始されたのはおそらく 1990 年前後です。初期の形式は今は oldgnu 形式と呼ばれており、その後 gnu 形式が登場します。gnu 形式は POSIX.1 の初期のドラフトの ustar 形式をベースにしたものですが拡張機能の実装に POSIX.1 ドラフトで未使用とされていた領域を使用していました。その後 POSIX の変更で未使用領域を別の目的に使用するように変わったため POSIX 標準の ustar 形式とは互換性がないものになったそうです。ドラフトの仕様をベースにするのが悪いと言われればその通りなのですが、意図的に互換性を無視して開発されたわけではありません。（参考 [ GNU and old GNU tar format](https://www.gnu.org/software/tar/manual/html_node/gnu.html)）

そして POSIX 1003.1-2001 では制限のない pax 形式が登場します。その名の通り `pax` コマンドで作成する形式ですが ustar 形式の拡張でもあり ustar 形式を扱えるアーカイバでは pax 形式に対応していなくてもそれなり（追加情報が別ファイルになる）に展開することが出来るように設計されています。つまり pax 形式は全く新しい形式ではなく tar 形式の一種です。pax 形式は GNU tar では posix 形式とも呼ばれており（ustar も POSIX なんですが・・・）、GNU tar の将来のデフォルト形式になるとのことです。

**ちなみになんですが、**

Debian で使われている `pax` コマンドは MirBSD で実装されたものを使っているようで **`pax` コマンドのくせに pax 形式** に対応していません。元々 pax 形式は後から追加されたもので POSIX の `pax` コマンドでさえ最初は pax 形式に対応いていなかった（というか pax 形式自体が存在していなかった）ので不思議ではありません。一方 `tar` コマンドの実装の多くは ustar 形式はもちろんのこと pax 形式にも対応する（している）でしょう。（ただし商用 Unix 系は POSIX で決まってないことは、あまりやりたくない感じなので期待できない。ある意味正確な POSIX 準拠主義ｗ）

えー、つまりですね。この話を統合すると `pax` コマンドでも `tar` コマンドのどちらでも、どの形式になるかは実装次第ではっきりせず、どちらのコマンドでも同じ形式を読み書きするから、結局どっちを使っても構わないということです。単なるコマンドラインインターフェースの違いでしかありません。現時点では pax 形式よりも ustar 形式の方がファイルサイズやファイル名などの制限はありますが互換性は一番高いでしょう。もし POSIX に対応してない環境まで考えるなら v7 形式にするしかないと思いますが。

どの tar 形式を使用するべきかは [Which tar file format should I use?](https://serverfault.com/questions/250511/which-tar-file-format-should-i-use) が参考になると思います。

### ファイルサイズ 8 GB 制限の壁 

**2021-10-12 追記**

元々の v7 形式のときから 8 GB の制限はあったとして、この制限はファイルサイズを示すフィールドが 12 バイトであることによる制限でのようです。このフィールドに 11 桁 （+ NULL 文字で 12 バイト）で **8 進数の ASCII 文字** でサイズを格納した時 77777777777 （8 進数） = 8,589,934,591 バイト で 8 GB です。

ファイルサイズのフィールドは 12 バイト = 96 ビットもあるわけで ASCII 文字じゃなくてバイナリで入れれば最大サイズは増やせますね。ということで最上位ビットを 1 にしたときに、残りの 95 ビットでファイルサイズを表現する base-256 コーディングが 2001 年の star (Schilly tar) で導入されたことが [wikipedia の tar](https://en.wikipedia.org/wiki/Tar_(computing)) からわかります。ちなみに star の開発者は後述している Jörg Schilling さんです。GNU tar と BSD tar もこの base-256 コーディングのアイデアに従ったとありますので、ファイルサイズ 8 GB を超える仕様は基本的に互換性があるようです。ただし古い GNU tar（oldgnu だと思われる）は base-64 の値を使ったようで互換性が無いようです。（参考 [FreeBSD man tar(5)](https://www.freebsd.org/cgi/man.cgi?query=tar&sektion=5) [[日本語訳](http://www.yosbits.com/opensonar/rest/man/freebsd/man/ja/man5/tar.5.html?l=ja)]）

base-256 コーディングが 2001 年に star で導入されたとありますが、wikipedia では 1997 年に Sun が tar （正確には ustar であるはず）を拡張する方法を提案し、それが POSIX.1-2001 に 拡張 tar 形式（pax 形式）として取り入れられたとあります。この時ファイルサイズが無制限であると書いてあるので base-256 コーディングの開発者が star なのか Sun なのか微妙ですが（もう少し調べれば分かるでしょうが今は興味がない）、少なくとも POSIX.1-2001 から 8 GB 以上に対応したということは明らかでしょう。

ちなみにですがファイルサイズ 8 GB の制限はテラバイト時代の今からするとキツイ制限のように思うかもしれませんが、POSIX.2 の 1992 年当時は、Windows 95 が登場する 3 年も前ですから民生用だと 1 GB の HDD はあったんだろうか？と悩むレベルの時代です。私が初めて買った HDD は 300 MB で 3 万円ぐらいだったと思いますが、たしか 1992 年 〜 1995 年の間だったと思います。Windows 95 でようやく FAT32 が登場して 2 GB の HDD が使えるようになりました。なのでそんなにキツイ制限とは言えません。POSIX.1-2001 での 8 GB 制限の撤廃はタイミング的にギリギリといった感じですが、それでも tar 形式で 8 GB （DVD 2 枚分）のアーカイブなんて今でもめったに作りませんよね？ 

## いつ pax が登場し tar と cpio は削除されたのか？

**2021-10-12 書き直しました → 2021-10-17 さらに書き直しました**

- 「[POSIXとUnix関連の標準規格と歴史年表 (IEEE, SVID, XPG, SUS)](https://qiita.com/ko1nksm/items/c79f802742e0c3be066d)」
- 「[POSIX + SUS 全コマンド一覧（全バージョン対応）](https://qiita.com/ko1nksm/items/ad88974b48e91d0289a2)

POSIX.2 (IEEE Std 1003.2-1992) のドキュメントは無料公開されていませんが、POSIX.2 で標準化されていたコマンド一覧は [The Single UNIX Specification Interface Tables](https://unix.org/apis.html) の [Version 2 Interface Tables](https://unix.org/what_is_unix/unixv2.pdf) から知ることができました。これを見ると POSIX.2 の時点、つまり POSIX でシェルとコマンドが標準化された最初の時点で `tar` コマンドは標準化されていましたが `cpio` は標準化されていなかったことがわかります。また `pax` コマンドはこの時点ですでに標準化されています。そして POSIX.1-2001 には `tar` コマンドの姿はありません。

一方 **SUS (Single UNIX Specification) では `cpio` と `tar` の両方が標準化されています**。SUS は 元は POSIX とは異なる標準規格で POSIX.1-2001 (Issue 6) から内容が POSIX と同期されました。われわれが普段 [POSIX のドキュメント](https://pubs.opengroup.org/onlinepubs/9699919799/)として参照しているものは SUS として Open Group が公開しているものです。その最新の POSIX のドキュメント = SUS のドキュメントを参照すると[`pax` の CHANGE HISTORY](https://pubs.opengroup.org/onlinepubs/9699919799/utilities/pax.html#tag_20_92_21) から少なくとも Issue 4 で `pax` コマンドが追加されていることがわかります。また [Issue 4 の PDF](https://pubs.opengroup.org/onlinepubs/009656399/toc.pdf)を参照すると `cpio` と `tar` も 「To Be Withdrawn」となっており将来での廃止が決定しています。

結論としては POSIX.2 (1992) では `tar` コマンドと `pax` コマンドが標準化されており、`cpio` は標準化されていなかった。そして POSIX.1-2001 で `tar` コマンドは削除された。SUS では Issue 4 (1994) で `pax` を導入し `cpio` と `tar` を非推奨となり Issue 5 で廃止、POSIX.1-2001 に統合される時には含まれなかったということです。ただしこれはコマンドの話であることに注意して下さい。cpio 形式と ustar 形式に関しては POSIX.1 (1988) の時点ですでに標準化されています。

さてここまでは `pax` / `cpio` / `tar` コマンドが導入された/されなかった時期はわかりました。ではどういう理由でそう決定されたのでしょうか？

そのヒントは [Austin Group の過去のメーリングリスト](https://austin-group-l.opengroup.narkive.com/4uDQU6nj/usr-group-standard)経由で見つけた [POSIX.2 のドラフト](http://www.nic.funet.fi/pub/doc/posix/) の中にありました（その後にこちらで [Draft 11.2](http://mirror.math.princeton.edu/pub/oldlinux/Linux.old/Ref-docs/POSIX/all.pdf) の PDFを見つけました）。

- Draft 2
  - **`pax` コマンドが存在し、対応する形式として pax 形式がすでに登場している**
  - **pax 形式は「ustar と cpio のどちらのファイル形式が適しているか？」という議論から生まれた**
 
> 4.48.7.8 Rationale — pax Interchange Format
> This is a data interchange format for POSIX that meets the requirements of interchange that were discussed in the debates on whether the USTAR or CPIO formats were the appropriate vehicles for such interchange.

- Draft 11.2
  - **`pax` コマンドの pax 形式への対応が削除されている**
  - `cpio` コマンドは `pax` コマンドによって置き換えられたと書かれている
     - ただし `tar` コマンドに関してはこの記述はない

> cpio
> This has been replaced by pax, for reasons explained in its own Rationale.

この内容からわかるのは、POSIX.2 を策定する段階で、すでに `pax` 形式について検討していたが後に削除されたことと（ POSIX.1-2001 で改めて標準化された）と、**pax 形式は「ustar と cpio のどちらのファイル形式が適しているか？」という議論から生まれた** という部分です。この議論とは何なのか？確信に迫ってきましたね。（と書いていますが、私の時系列は色々調べた後に POSIX.2 関連の資料を見つけています。）

## TAR WARS - cpio と tar のどちらを標準化するべきかという論争

この話はどうやら元々ファイル形式の話として始まったようです。cpio 形式 vs tar 形式です。といってもそれぞれの形式を扱うコマンドが `cpio` コマンドと `tar` コマンドであるためコマンドの（インターフェースの）話にも波及してしまいます。

この話について調べるには [TAR versus Portability](https://www.invisible-island.net/autoconf/portability-tar.html) のページが良いスタート地点になりました。タイトルの通り tar の移植性につい書いてあるページでとても参考になりました。

特に興味深かったのは以下の部分の「[tar vs. cpio](http://tech-insider.org/unix/research/1987/0601.html)」のリンク先のメーリングリストです。

> The program itself was the result of a failure to agree on whether tar or cpio was the one to standardize, and as a result we have a program which does either. The newsgroup thread beginning with John S. Quarterman's posting [tar vs. cpio](http://tech-insider.org/unix/research/1987/0601.html) to comp.std.unix on June 1, 1987 summarizes the different points of view.

ここには tar と cpio のどちらの形式を POSIX で標準化するか？についての意見が書かれています。**1987 年と書かれてあることからも分かるように POSIX.1 (1988) が誕生する前の話**です。

長いので要約すると cpio へのいくつかの問題点が指摘されています。cpio よりも tar の方が一般的であったと書かれています。tar には拡張性があると書かれています。全体的に tar 有利に見えるのですが、コマンドラインインターフェースに関しては cpio の方が好まれていると書かれています。標準入力からアーカイブに追加するファイル名を指定できるため Unix の文化に適合しているということらしいです。私は cpio に詳しくないのでわかりませんが、[これ](http://buug.org/pipermail/buug/2012-October/003944.html)や[これ](https://tanguy.ortolo.eu/blog/article6/cpio-tar
)が参考になるのではないかと思います。その他 cpio と tar の形式の違いは GNU [Comparison of tar and cpio](https://www.gnu.org/software/tar/manual/html_section/cpio.html) のページが参考になります。

冒頭で少し書きましたが **tar と cpio はどちらも AT&T によって開発されたコマンド**です。tar は上のファイル形式の話でも出てきたように Version 7 Unix (1979) なので AT&T ですし、このメーリングリストで以下のように AT&T で PWB/UNIX 1.0 (1977) と共にリリースされたことが書かれています。

> PWB/UNIX 1.0, which AT&T did release.

いつどこでリリースされたかは wikipedia の [tar](https://en.wikipedia.org/wiki/Tar_(computing)) と [cpio](https://en.wikipedia.org/wiki/Cpio) のどちらのページにも AT&T Bell Laboratories と書かれてあるのですぐに分かると思います。なぜ同一ベンダーで同じようなソフトウェアを作ってしまったんだろう？と思いましたがよくわかりませんでした。時系列的には `cpio` の方が早いように見えるのですが、PWB (Programmer's Workbench) は少し特殊な製品のようであまり一般的には広まっていなかったようです。それが `tar` の方がメジャーになった理由でしょう。また `tar` は以前からあった `tp` コマンドを置き換えるコマンドのようなので少し違う意味を持っています。それにどちらが先に開発が始まったのかまではわかりませんし、お互いに相手のことを知らずか、知っていたとしても別の目的のために開発していたので、結果同一ベンダーで同じようなソフトウェアができてしまったのだと思います。

また AT&T が「これからの時代は cpio だ」のようなことを言ったため cpio の利用者が増えたという話もあります。この話は [What are the relative merits of the various standard Unix archival utilities?](https://unix.stackexchange.com/questions/76241/what-are-the-relative-merits-of-the-various-standard-unix-archival-utilities) で schily (Jörg Schilling) さんが回答をされています。POSIX 標準化の初期から関わっている方で POSIX 関係で（やそれ以外でも）大変有名な方です。 上の方で書いた「Austin Group の過去のメーリングリスト」でもコメントされています。

話を戻すと「tar vs. cpio」のメーリングリストの内容をざっと見る限り cpio vs tar というのはコマンドラインインターフェースが優れている `cpio` コマンドを採用するか、ファイル形式に優れている tar 形式にするか？という議論がメインであったように見えます。そしてこの議論は **tar wars** と呼ばれているようです（ぜったい STAR WARS を意識してるやろ？）。

tar wars に言及している URL

- https://linux.die.net/man/1/spax
- https://memim.com/cpio.html
- https://groups.io/g/simh/message/62

## POSIX はどちらを標準化するか決めることができなかった

**tar wars** - cpio と tar のどちらを POSIX で標準化すべきかという議論が起きた時 POSIX 標準化委員会はどちらを選ぶかを決めることができませんでした。その結果**やらかしてしまったのが cpio コマンドと tar コマンドのどちらも廃止して新しく pax コマンドを開発する**という、いわゆる「作り直す」という決断です。（注意 cpio 形式と tar 形式を廃止するわけではありません。廃止するのはコマンドだけです。pax コマンド一つで cpio / tar / pax 形式すべてを扱えるので、不要になった `cpio` コマンドと `tar` コマンドを廃止するという話です。）

※ 一応言っておくと大失敗だと思ってるのは私です。もしかしたらこの先 `pax` が普及するかもしれません。

しかし POSIX という標準化団体がすべきことは「どの環境でも移植性があると認められるコマンドを標準化すること」だったはずです。 `pax` コマンドを新しく作って移行させるなどというのはどう考えても間違った判断です。

`pax` コマンド開発までの時系列

- 1998: **POSIX.1 (IEEE Std 1003.1-1988)**
  - ustar 形式登場
- 1989: `pax` Mark H. Colburn による 最初の実装（商用 Unix 系で採用されている？）
- 1992-1993: `pax` Keith Muller による実装開始
- 1992: **POSIX.2 (IEEE Std 1003.2-1992)**
  - `tar` はあるが、`cpio` はない
  - `pax` はある。ただし pax 形式には非対応
- 1995: `pax` Keith Muller 版が 4.4BSD で登場
- 1995: Issue 4
  - `pax` はある。ただし pax 形式には非対応
  - `cpio`/`tar` (TO BE WITHDRAWN)
- 1997: Issue 5
  - `cpio`, `tar` (LEGACY)
- 2001: **POSIX.1-2001 (IEEE Std 1003.1-2001)** = Issue 6 （標準規格統合）
  - `pax` （pax 形式誕生）
  - `cpio` / `tar` （ない）

（初期の）`pax` コマンドの実装は 2 つあります。一つは Mark H. Colburn 実装版で、もう一つが Keith Muller 実装版です。このいずれも POSIX 登場より後であり、POSIX の仕様策定と共に開発されているというのがわかります。

最初の実装者である [Mark H. Colburn のメール](https://groups.google.com/g/comp.sources.unix/c/-UaUljFHeJA) により、当時の `pax` コマンドの開発状況がわかります（このメールへは[TAR versus Portability](https://www.invisible-island.net/autoconf/portability-tar.html)からたどり着くことができます）。このメールにはいくつか興味深いことが書かれています。

> Three user interfaces are supported: tar, cpio, and pax. The pax interface was designed by IEEE 1003.2 as a compromise in the chronic controversy over which of tar or cpio is best.

`tar`、`cpio`、`pax` の 3 つのユーザーインターフェースに対応しており、`pax` のインターフェースは IEEE 1003.2 (つまり POSIX.2 - シェルとコマンド) での `tar` と `cpio` のどちらが優れているかという論争を解決するために設計しました。とあります。基本的なインターフェースは彼が設計したということでしょう。その言葉通り tar 形式が扱え `cpio` コマンドのインターフェースを備えたいいとこ取りになっています。

> The source for Pax will continue to change as long as the definition of the utility is modified by the 1003.2 working group. (For example, there are a number of changes in Draft 8 which will be incorporated as soon as Draft 8 is available). 

POSIX.2 での仕様が変更になるたびにソースコードも修正しますとあり、ドラフト 8 での変更が利用可能になり次第取り込むと書かれています。

もう明らかですね。最初の実装こそ Mark H. Colburn が行っているものの POSIX はそれまで世の中で使われていないソフトウェアの仕様を自分たちの手で作っていっています。POSIX の仕様策定の流れは「**世の中に複数の実装がある→POSIX で標準化する**」であって「**POSIX で仕様を策定する→それを待ってベンダーが実装する**」というものではありません。POSIX が新しいコマンドの仕様を勝手に策定してもうまく行かないのです。POSIX は仕様の実装をベンダーに強制することはしなかった、決められてない部分はベンダーが自由に拡張することが許されていたということが POSIX が支持された理由です。

もちろんこういう指摘は今だから言えるのであって、当時の人達にはいろんな課題があったと思います。複数のアーカイブ形式を標準化するのは無駄なので統一したいでしょう。ならば良いものを選ぶ必要があります。cpio 形式は拡張性がないため ustar 形式を選ぶのは必然の流れですが、かといって既存の cpio 形式への対応を打ち切るわけにも行きません。ならばコマンドは一つに絞って、そのコマンドは複数のアーカイブ形式に対応可能にし、互換性のために過去の形式にも対応するようにしようと考えるのはわりと自然な発想です。また、POSIX 標準化の時点ですでにいくつかの tar の実装があったと思われますので、それらのオプションの違いや各実装の細かいファイル形式の違いを整理しなければいけないという作業もあったはずです（それが POSIX がやってる標準化という仕事のはずなのですが）。大変な作業であることには間違いないので同情の余地はあります。しかし、やはり `cpio` や `tar` の廃止を決める前に世の中の流れを待つべきだったのではないかと思います。

知っての通り、世の中の流れは `tar` コマンドが tar 形式だけでなく cpio 形式やその他の形式にも対応する方向に進みました。それだけではなく gzip 圧縮・展開機能まで含まれ、最近は圧縮・アーカイブ形式を自動判定しますしとても使いやすくなりました。（ただしこれは `tar` コマンドという名前からはもはや適切なものにはなっておらず、Unix 哲学の「一つのことを、うまくやれ」には反しています。ですが `pax` コマンドも反しているのは同じです。まあ哲学なんてそんなもんです。正解がないから「哲学」なんです。）

POSIX も早く仕様を策定しなければいけませんし `cpio` コマンドを廃止するのは既定路線だとしても、`tar` コマンドが今のようになるのを待つわけにも行かなかったでしょう。かといって自らの手で `tar` を cpio 形式に対応するような拡張を入れるのも微妙な感じですし、どちらのコマンドを選ぶかを決めきれなくて `pax` コマンドを新たに開発することを選択した気持ちもわからなくはありません。ですが POSIX 主導で新しい `pax` コマンドの仕様を策定した結果は現状の通り失敗に終わったというのが現実です。

## まとめ

### 時系列

1. 同時期に `cpio` コマンドと `tar` コマンドの両方が AT&T で作られた<br>_（異なるベンダーで作られたわけではない）_
2. **POSIX 策定中にどちらの形式（またはコマンド）が優れているかの論争が起きた**<br>_（メディア効率は cpio 形式が優れているが仕様や拡張性は tar 形式が優れている）_<br>_（コマンドラインインターフェースは cpio が優れている）_<br>cpio 支持者と tar 支持者の戦い ⇒ **tar wars** 勃発
3. **POSIX 標準化委員会はどちらを標準化するか決められなかった**<br>互換性のために cpio 形式と tar 形式を廃止することはできない<br>どちらのコマンドも捨てがたいし各実装のオプションの違いを整理するのは大変
4. **POSIX.1 (IEEE Std 1003.1-1988) C 言語用インターフェースを標準化した**<br>拡張 tar 
 形式（ustar 形式 = v7 形式の拡張）と拡張 cpio 形式もこのとき標準化された（？）<br>↑これらの仕様は `pax` コマンドの所に書いてあるから POSIX.2 で標準化された可能性がある<br>_（ustar 形式はファイル名の最大文字数は増えたが 8 GB の制限は残っている）_<br>_（cpio 形式は詳しく調査してないが複数の亜種を統合したものであるようだ）_<br>_（C 言語 APIの規格なのでこの時に `cpio` / `tar` コマンドが規定されることはない）_
5. `pax` コマンドの実装が誕生した（cpio / ustar 両形式に対応した新コマンド）<br>複数の形式に対応可能で両方のインターフェースに対応した万能コマンド、素敵じゃん<br>POSIX.2 ドラフトの仕様改定に対応しながら `pax` コマンドの開発・修正が行われた<br>_（POSIX.2 が登場前に `cpio` / `tar` コマンドは将来廃止と決まっていた）_<br>_（`cpio` コマンドの廃止の理由の一つは 8 GB 以上対応への拡張が不可能だったから）_
6. **POSIX.2 (IEEE Std 1003.2-1992) シェルとコマンドを標準化した**<br>**`tar` コマンドは標準化されたが `cpio` コマンドは標準化されなかった**<br>_（SUS では両方標準化されていたが POSIX と統合される前に非推奨→廃止となった）_<br>**`pax` コマンドは追加されたが対応形式は POSIX.1 で標準化した cpio / ustar 形式だけ**<br>_（pax 形式は構想はあったが完成してない。故に 8 GB 制限は残っている）_
7. 1997 年頃 Sun より ustar 形式の拡張（pax 形式）が提案される （8 GB 以上対応等） 
8. **POSIX.1-2001を標準化した** (POSIX.1 と POSIX.2 の統合、そして Issue 6 との同期）<br>**`tar` コマンドが削除された**_（`cpio` コマンドは元よりなく `pax` コマンドに一元化）_<br>**`pax` コマンドが ustar の拡張形式である新しい pax 形式に対応した**<br>_（この時ようやく POSIX で 8 GB 以上のアーカイブが扱えるようになった）_
9. **POSIX.1-2008 標準化** 〜 2021 年現在<br>誰も `pax` コマンドに移行しない。`tar` コマンドで十分で圧縮・展開もできるから。

概ね正しいと思いますが細かい順番は前後してるかもしれません。厳密な記録や資料がないので正しい歴史を調べるのは大変です。

### 標準化の難しさ

ともあれ標準化作業というのはとても大変な仕事であるというのは想像がつきます。また人々は新しいコマンドを作った所でなかなか乗り換えようとしないと言うのも私も含めてその通りなのでしょう。POSIX が作ったと思われるコマンドは他にもあります、それが [Batch Utilities](https://pubs.opengroup.org/onlinepubs/9699919799/utilities/V3_chap03.html) と呼ばれる `q` で始まるコマンド群です。このコマンドは POSIX.2d (IEEE Std 1003.2d-1994) として開発され POSIX.2 に含まれたものであるようです。最新の POSIX.1-2008 で廃止 ([OB] Obsolescent)とマークされており、次の POSIX で削除されるため詳しく調べていませんが分散バッチ処理（？）を実現するもののようです。これもそれまで使われてないものを標準化してもうまく行かないというもう一つの例です。

これらの件に関して POSIX は当時間違った選択をしましたが、今ならそんなことにはならないと思います。なぜなら以前とは違い今はかなりオープンに仕様の改定が行われているからです。間違った選択をしようとするならば誰かがそれを止めるでしょう。また POSIX 主導で新しい仕様を作るのも、インターネットとオープンソース文化が普及した今なら可能なのではないかと思います。例えば `seq` コマンドのように便利でどこにでもありそうなコマンドは他にもありますから、それらが標準化されたらソフトウェアの移植性はさらに高くなるでしょう。`wget`、`jq` あたりも標準化されて欲しいですね。

### さいごに

さて最後になりますが `pax` という名前には portable archive interchange という略の他にラテン語で「平和」という意味があります。[POSIX pax の RATIONALE](https://pubs.opengroup.org/onlinepubs/9699919799/utilities/pax.html#tag_20_92_18)にはこのように書かれています。

> The pax utility was new for the ISO POSIX-2:1993 standard. It represents a **peaceful** compromise between advocates of the historical tar and cpio utilities.

（`pax` ユーティリティーは POSIX-2:1993 で登場しました。これは歴史的な `tar` ユーティリティー支持者と `cpio` ユーティリティー支持者の間の平和的な妥協を象徴しています）

これは Mark H. Colburn のメールに書かれている言葉 `[ The name is Latin for "peace." --r$ ]`からの引用だと思います（なので POSIX ではなくて彼が `pax` コマンドの命名者だと思うのですが・・・。ところで`--r$` ってどう意味です？）。本来の意味は tar **戦争**、つまり tar 支持者と cpio 支持者の戦いを終結させて**平和** (peace) に導くという意味だったに違いありませんが、POSIX 標準化委員会の人達にとっては終わらない論争の板挟みから解放されて、**穏やか** (peacefull) な日々を取り戻すための素晴らしい解決策に思えたのかもしれませんね。

## 更新履歴

- 2021-10-12
    - tar のファイルサイズ 8 GB 制限の話を追加
    - Batch Utilities の話を追加
    - POSIX.2 (1992) に `cpio` / `tar` コマンドがないことが確認できたので記事を更新
- 2021-10-13
    - まとめを見直した
- 2021-10-15
    - `cpio` コマンドについて情報を追加
    - GNU tar の互換性に関する情報を追加
- 2021-10-17
    - 追加の調査で [The Single UNIX Specification Interface Tables](https://unix.org/apis.html) を発見し [Version 2 Interface Tables](https://unix.org/what_is_unix/unixv2.pdf) より `tar` が POSIX.2 (1992) で標準化されていることを確認したため、記事を訂正しました