📼

いまさら tar

に公開
3

Discussion

ko1nksmko1nksm

tar(1) の POSIX 規格は ISO/IEC 9945-1:1996 (“POSIX.1”) にはありましたが

ちょうどこの件に関する情報を調べていたのですが、おそらく ISO/IEC 9945-1:1996 にも tar(1) は無かったと思います。なぜならこれは C 言語 API の規格だからです。

ISO/IEC 9945-1:1996
Information technology — Portable Operating System Interface (POSIX) — Part 1: System Application Program Interface (API) [C Language]

こちらを見ても、シェルとユーティリティが最初に標準化された POSIX.2 (1992) に tar は含まれていません。ただしこちらを見ると以下のように書いてあるため tar 形式については規定されてあった可能性が高いです。

It also defines a format for data interchange.

POSIX (POSIX.1-2001) と統合される前の SUS (Single UNIX Specification) には tar が含まれていましたが、削除されてから POSIX へ統合されました。


システム間での交換可能性を保ちたいのであれば,POSIX コマンドで tarball を扱える pax(1) を利用するのが良いかもしれません.

実際に重要なのは、複数ある tar 形式のどれを使用するかという話で、pax (1) が使用する ustar 形式 または pax 形式(共に POSIX で標準化された歴史的な tar の拡張形式)は、GNU tar や BSD tar も対応しているはずなので、明示的に形式を指定すれば tar(1) を使っても大丈夫だと思います。

KusaReMKNKusaReMKN

tar(1) の POSIX 規格は ISO/IEC 9945-1:1996 (“POSIX.1”) にはありましたが

この部分は BSDTAR(1) の Man page からの引用でした (BSDTAR(1) の Man page を参考にしたことを明記し忘れていることに気が付きました). たしかに,ISO/IEC 9945-1:1996 には tar(1) について書いてなさそうです.

ファイル形式 tar(5) については,新たに調べてみたところ,次のような文言を見つけました. もしかしたらこれのことかもしれません.

IEEE Std 1003.1-1988 (“POSIX.1”) の初期のドラフトは、John Gilmore の pdtar プログラムや、1980 年代終わりから 1990 年代始めにかけてのシステムの実装の基礎となりました。
(中略)
IEEE Std 1003.1-1988 (“POSIX.1”) は、対応した tar(1) 実装で読み書きが出来る、標準的な tar ファイルフォーマットを定義しています。
TAR(5)


システム間での交換可能性を保ちたいのであれば,

これはまさしくその通りです.

(もはや気にする必要はありませんが) tar(1) には出力フォーマットを指定できないものもあります (SUS の tar(1) はそれの一例です). “Tarball の形式について深く考えずにアーカイブを操作したいならば pax(1) が一番かもしれないな” くらいの気分でした. もっとも,きっと最も多く使われている tar(1) は GNU tar でしょうから問題もそう多く起こらないはずです.

ko1nksmko1nksm

なるほど BSDTAR からの引用でしたか、気づきませんでした。

こちらは一つ訂正です。

シェルとユーティリティが最初に標準化された POSIX.2 (1992) に tar は含まれていません。

どうやら参照先のリストから tar の項目自体が削除されてしまっていたようです。それよりも古いリスト(こちらの Version 2 Interface Tables)を発見したので、それを調べた所 POSIX.2 に tar が含まれていたことを確認しました。

なので BSDTAR(1) の Man page …

There is no current POSIX standard for the tar command; it appeared in
ISO/IEC 9945-1:1996 ("POSIX.1") but was dropped from IEEE Std 1003.1-2001
("POSIX.1").

ISO/IEC 9945-1:1996 ("POSIX.1") は間違いで ISO/IEC 9945-2:1993 ("POSIX.2") が正しいのかもしれませんね。それはそれとして「"ISO/IEC"で登場」して「"IEEE" で削除」という書き方はおかしいわけですが。