Think GNU 第 6 回

□カスタマイズのしやすさと圧縮プログラム□

CUJJ#10/'90.7.18 発売号掲載

0. はじめに

 公私ともに切迫感がだいぶ高まってきた。半端じゃない。会社の組織が変わりつつあって落ちつかない最中に、夏の USENIX に出発するので、ありとあらゆる予定が前倒しになっている。「GNU ダイジェスト」の日本語訳も USENIX で配布するのでこの時期に行なう。渡米の準備もしなければならない。そんなわけで、CUJJ の原稿もここ半月の間に 2 回分を仕上げなければならないことが判明した。帰ったら帰ったで、ほとんど毎晩終電で帰宅しても、あたりが明るくなるころまでは床につけない今日このごろである。それこそ盆と正月が一緒にやってきたような忙しさである。いったいいつになったら眠れるのやら……。やはり渡米の飛行機の中かもしれない。プロジェクト GNU に染まって以来、このような忙しさが半年に 1 度は訪れるサイクルになっているので、精神的にはさほどプレッシャーを感じていないのがせめてもの救いである。◆1

1. カスタマイズ、あれこれ

 以前は特にスケジュール管理をしなくても予定を記憶できるぐらい予定がなかったが、今では日程を覚えきれなくなった。もうスタック・オーバーフローになるほど予定が増えたのか、記憶の容量が少なくなったのか ? とにかく何かに書き留めておかねばならなくなった。昔は流行のシステム手帳を使っていたが、ワークステーションのディスプレイの前に座っている時間が多くなった現在では、自社製 X Window スケジュール管理ツールを用いてチェックするようになった。これには次のような機能がある。

 使い込んでくると、このツールのレイアウトをちょっと変えたいとか、表示の順序を少し入れ換えたいと思うようになる。そのためには C 言語で書かれたソース・プログラムを解析しなければならない。そしてコンパイル、リンクという運びになる。しかし、途中でバグが入り込めば、そのサイクルが 1 度ですまない、と考えるとやはりカスタマイズ用の言語が欲しくなる。

 ソース・プログラムの修正から実行までの開発サイクルの短縮を狙ったものが最近、ニュース (uunet の電子掲示板) に投稿された。★4 それは AWL(Another Widget Language) という名前の、コンパイラ・インタープリタで、X Window System 用のライブラリの部分を記述する目的で作成された。ちなみに、X ではライブラリよりさらに大きく、オブジェクト指向的な特徴をライブラリに入れたひとまとまりを widget(ウィジェット) と呼んでいる。

1-1.AWL という名の言語

 C 言語で書かれたプログラムを X のような大きなウィンドウ・システムのライブラリとリンクしようとすると、それだけで時間がかかり、さらに試行錯誤 (error&retry) にも時間を費やし、おまけに記述性もそれほど良くはない。この AWL という言語はウィンドウ操作のために記述性の良いものを提供し、その言語で書かれたものと C 言語で書かれたものをリンクして、移行性を失わないようにしている。しかも、中間言語を使ったコンパイラ・インタープリタ方式を採用してリンクの時間を短縮している。言語仕様は C に近く、既存の C ソース・ファイルとリンクされる。ちなみに AWL であって AWK ではないのでお間違えなく。

 このプログラムには技術的に面白い点がある。中間コードを解釈していて、かつ C コードとのリンクが可能なことである。これならば C 言語のインタープリタを作成する上で大変参考になる、とひらめいた次第である。以前ボストンで gcc を改良して GNU C インタープリタを設計しながら試作を行なっていた時期に、既存の C 言語で書かれているオブジェクトとリンクさせるための方法と内部構造の設計が大変であった。冒頭の理由から、まだ AWL のソース・コードは調べていない。これからの課題である。

 AWL は最近出てきたものであるが、既存のものにも開発のしやすさを狙ったものがある。X 用の応用プログラムの中で、カスタマイズの容易性があって有望そうなものに Common Lisp の採用が挙げられる。その Common Lisp で記述された商品ソフトウェアやコピー・フリーになっているソフトウェアが何種類かある。例えば、Common Window や CLX などが挙げられるが、いずれも規模が大きい。◆2,3

1-2.X Window System のウィンドウ・マネージャのカスタマイズ

 X の場合、さまざまなウィンドウ・マネージャから自分の気に入ったものを選び、自分なりにカスタマイズして使うことができる。それに対して Macintosh を考えてみると、ウィンドウ・マネージャは基本的に 1 種類だけであり、プルダウン・メニュー *1 のタイプである。X の面白そうなウィンドウ・マネージャとして GWM ★1 がある。これは Lisp ライクな拡張言語を備えており、X サーバ上で動作しているそれぞれのクライアントを管理する。以前に紹介したマルチスクリーン・バージョン Epoch と組み合わせて使うと有効性が発揮できるとのこと。どういうふうに有効なのかは、はっきりわからない。やはり実際にインストールして使ってみなければ始まらない。

 Epoch は GNU Emacs をベースにしている言語である。ようやく先月から Epoch の日本語化バージョン Nepoch を使い始めている。面白そうだとわかっていながら、次のステップとして GWM を併せて使ってみるところまで至っていない。もう頭が堅くなってしまったのか。何をするにも億劫という年になったわけでもないのに。

1-3. 再びスケジュール管理ツール

 スケジュール管理プログラムのカスタマイズの容易性を狙って、Emacs の方でスケジュール管理パッケージを作ろうかと思ったら、もう既に次のようなものを作っていた人がいた。

パッケージ名 calender.el

作成者 Edward M. Reignold

概 要 GNU Emacs には cal.el という単純なカレンダー表示ライブラリが入っているが、それの拡張版

機 能

 このパッケージの欠点を次に示す。

 さらに GNU Emacs をベースにしているために、GNU Emacs の次のような欠点も継承している。

 利点としては次のようなものがある。

 C 言語で作成した X Window System ベースのプログラムには次のような特徴がある。

利点

欠点

 この比較結果から、GNU Emacs が完全に X Window System をサポートすればおおかたの問題は解決される。逆に C 言語で書かれたもののカスタマイズの容易性を上げるためには前述の AWL を使ってみるのも 1 つの方法であろう。プロジェクト GNU では GNU Emacs の次のバージョンを作成中である。

2. 昔の Emacs 環境

 Emacs には gcc、gdb に次いで思い入れがある。というのは、だいぶ以前から Emacs をぜひ使ってみたいと思っていたからである。大学時代に、OA 関係の論文の中で Emacs に関するものがあった。それが頭にこびりついて離れなかった。会社に入社したころ、同期の人間の中に Emacs(Gosling Emacs) を学生のころに使っていた人がいた。その人から Emacs の機能を聞きマニュアルを見せてもらって、多くの有用な機能を備えていることが改めて理解できた。当時、会社で使っていたマシンはスーパー・ミニコンピュータと呼ばれる DEC VAX-11/780 と 750 であった。◆5

 この DEC VAX-11/780 は今では MIPS 原器 (1MIPS の基準) と呼ばれてもいいほどのマシンである。最近のワークステーションやマイクロプロセッサの性能を示すのに、あるプログラムの実行時間を VAX-11/780 との比較結果で表現しているケースがある。一番多いのが、Dhrystone というプログラムを採用する場合である。これはもともと Ada という言語で書かれた計算機の性能テスト・プログラムではあるが、むしろ文字列処理が一様に含まれていてそのオペレーションの数がわかっているプログラムと言った方がその性格がわかりやすいだろう。それが Pascal や C 言語、Lisp にまで書き直され、ベンチマーク・テスト・プログラムとして用いられるようになったわけである。

 会社でも Gosling Emacs を導入することになり、マニュアルを読んで勉強した。その表紙には Unicorn(一角獣) が描かれていたのが印象的であった。覚え始めは緊張した。1 つのミス・オペレーションでファイル全ての内容を失うこともしばしば経験したからである。その後のバージョンアップで Undo 機能が追加され、安心して使えるようになった。Undo とは、実行したあるコマンドを無効にし、そのコマンドを実行する前の状態に戻す機能である。

 そのころ、「Dr. Dobb's Journal」(パーソナル・コンピュータ向けの米国の月刊誌で通称 DDJ) に「GNU Manifesto」(GNU 宣言) の記事が紹介されて、同じ部署の人が GNU Emacs を使い始めたが、Undo の機能がない点と Gosling Emacs とキー・バインディング (コマンドのキー割当) が微妙に違うといった点に難点があった。加えて、当時の GNU Emacs はバージョン 17 で安定していなかった。ちょっと使っただけでコアダンプ *2 してしまった。そのためになかなか GNU Emacs に移行するチャンスがなかった。◆6

 当時の Emacs 使用者に対する世間の目には厳しいものがあった。つまり 1 台のマシンを複数の人間が TSS(時分割、Time Sharing System) で使っていたので、1 人だけ CPU リソースを占有するとそれ以外の人から反感を持たれる。Emacs を使い始めたころは DEC VT100 を端末として使い、その後 VT220 へと移行していった。一画面が 24 行しかないので、通常はウィンドウを 2 つに分けて Emacs を使っていた。日中の 1 時から 3 時ころまでが CPU の使われ方のピークであった。ロードアベレージは 10〜20 が普通で 30 を越えることもままあった。30 を越えるともう仕事にならず、机上作業に移り、ロードアベレージが下がるのを待つ。そんな時にログインしようものなら、ログイン・プロンプトが出るまで 2〜3 分かかってしまう。

 Unix の世界ではマシンの混み方の度合いを測る尺度にロード・アベレージというものがある。Unix の w コマンドを使うと、1 分、5 分、15 分間の実行プロセスの待ち行列の平均ジョブ数を表示する。これがロードアドレスである。

 例えば、1 台のワークステーションにユーザが 1 人で編集していると数値は 0.1 ぐらいだが、それが 4〜5 人ほどで時々コンパイルするようになると途端にロード・アベレージは 2〜3 にはね上がるという具合である。

 計算機関係のどの分野でも言えることだが、今から考えると隔世の感がある。今は昔の話であった。

3.GNU 史探訪

 だいぶ現在に近くなり、Richard との接点があらわれる。おそらく、DECUS(DEC のユーザ会) のシンポジウムに招待され発表の合間に我が勤め先に寄ったものと思われる。筆者はそのころ三田方面に出向していたが、会社に戻っているときに Richard Stallman が会社にやってきた。筆者はちょっと挨拶をして、rms からオープン・リールのテープを借りて、内容をマシンにコピーした。借りたテープには gcc の初期バージョン (おそらくバージョン 1.3 だったと思う) が入っていた。rms 曰く、作業中のものなのでいくらかバグがあるとのこと。さっそく Sun-3 で動かしてみた。そのころの gcc のサポート・マシンは VAX と Sun のみであった。会社ではそろそろワークステーションの時代を迎えつつあった。手近なマシンである SONY NEWS に gcc を移植しようと決意し、少しずつ作業を進めた。というのは、偶然にも、これよりも前にこのマシンに Franz Lisp の移植をして、SONY NEWS のシステム・コールや C コンパイラのコード生成の概略を押さえていたので、そのノウハウが効を奏していたためである。

 こんな発端から GNU の世界にのめり込むことになった。

プロジェクト GNU 歴史年表

年 代        出 来 事
1987/2     UNIX Review 誌より岸田 ((株)SRA) へのインタビュー
           同社より、日本で初めての GNU への援助金寄付
1987/4     gcc バージョン 1.4 リリース
           Richard M. Stallman 来日 (東京、大阪)
           gcc の SONY NEWS への移植開始
1988/2     各種 GNU ソフトウェアやマニュアルのリリース
             Make、ANSI C ライブラリ、Ghostscript、termcap マニュアル、
             gprof、GNU Emacs 18.51、gdb(32k 用)、gcc(32k, VMS, NEWS 用)
             G++(GNU C++) の作成開始
1988/2〜4  UCB 向け SPUR 用 gcc の開発
1988/3(〜'90/2)
           (株)SRA より物・人・金の援助
1988/4     gcc の SONY NEWS への移植
1988/5     各種 GNU のリリース
           Bison マニュアル、G++、gas(GNU Assembler、VAX, 68k 用)、gawk、
           gcc 386、gdb COFF、GDB+、GNU Emacs(30 種類以上のマシンで動作)、
           GhostscriptX、make、T(Scheme コンパイラ)、flex、grep、ld、ls
1988/6    (株) ソニーよりマシンの援助
1988/ 初秋 NeXT 社が初めて、GNU Emacs と gcc、gas、ld gdb を
           基本システムとして採用
1988/10    gdb の SONY NEWS への移植
1989/1     GDB+ の gdb への組み込み
           各種 GNU ソフトウェアのリリース
             4.3BSD tahoe、bison、gawk、gcc、gdb、GNU Emacs Manual、
             Ghostscript、gnuplot、Make、OOPS、texinfo、finger、
             libg++、mailer、send、tar、termcap、texi2roff
1989/8     MIT から正式にプロジェクト GNU 用の場所 (作業部屋) を提供

4. アーカイブ・プログラムの周辺

 Unix の世界だけに限ると、アーカイブ・プログラムには次のようなものが存在した。tp は DEC のミニコンピュータに非常に依存したもので、現在では使われていない。tar はおそらく一番広く使われており、dump はハードディスクのダンプに、cpio は Unix System V 系でよく使われている。

tp、tar、dump、cpio

 プロジェクト GNU では GNU tar を広く使っている。GNU tar はもともと PDS(Public Domain Software) として配布されていたが、プロジェクト GNU でそれを取り込み、独自の拡張とバグ修正を施して copyleft で保護し、現在に至っている。

4-1.GNU tar

 よく使うオプションにアーカイブ・ファイルを圧縮する-Z または-z がある。それ以外にも数々の特徴があるので主なものを次にご紹介する。詳細は補遺の「GNU tar のオプション一覧」を参照のこと。

4-2. ファイル圧縮プログラム

 GNU tar でも採用されている圧縮プログラムを少し考えてみたい。圧縮プログラムの適用範囲を考えると、一般のディスク上のファイルだけでなくさまざまな分野、あるいは特定の分野が対象になってくる。

 例えば、画像ファイルを対象にしたアルゴリズム、ファックス用のもの、音声ファイルを対象としたもの、動画用 (最初の画面さえ送っておけば、動画の差分だけを送って転送情報の削減を狙った方法など)、モデム用などがある。

4-3. 圧縮の考え方

 基本的な考え方は、入力ファイルの中で出現頻度の高いコード (一般に文字ごとに扱うためバイト単位) に短い符合を割り当て、出現頻度の低いコードには長い符合 (ハフマン・コード、huffman code) を割り当てるというアイデアである。

 これをそのままアルゴリズム化すれば圧縮プログラムはできあがるわけである。つまり、ファイルを最初から最後まで読み込んでそれぞれのコードの出現順序を調べるという仕組みである。出現順序の高いコードから短い符合を割り当てて出現コードの全ての符合割り当てを行なう。しかしながら、ファイルを全て読み込まないと処理できないという欠点がある。これは Unix の pack コマンドで採用されているアルゴリズムである。★6・7

 それを改良したアルゴリズムが適応型ハフマン符合化で、これは変換表をダイナミックに作っていく方法である。Unix の compact で採用されている方法である。

 コードごとに符合化していくわけであるが、コード間の冗長性を加味した方法が LZW(Lempel, Ziv, and Welch) アルゴリズムで、簡単な方法でコード間の冗長性を取り除いている。これは Unix の compress で使用されているアルゴリズムである。

 その他に、Miller-Wegman 符合化アルゴリズム★8 を使った squeeze という圧縮プログラムがニュース (uunet の電子掲示版) に流れていた。

4-4. 圧縮プログラムの種類

 圧縮プログラムにはさまざまな種類があるが、どういうわけか、Unix の世界では compress/uncompress しか見かけない。それ以外にも少しある。Unix の世界では昔、compact/uncompact が使われていた。例えば、foo というファイルを compress すると foo.Z という圧縮ファイルになる。Z という拡張子を自動的につける。compact の場合は C であった。

 そういえば POSIX の規格の中にも compress/uncompress が入っていて、その仕様を提供しているのではなく、プログラム自体を提供している唯一のコマンドであった。

 パーソナル・コンピュータの世界で多用されている LHarc は Unix マシンにも移植されている。Unix の世界ではこれ以外の圧縮プログラムとして、ネットワークに流れていた squeeze/unsqueeze というプログラムがある。Unix 上で使ってみた結果、次のことがわかった。

 compress は圧縮もそこそこで実行時間も短く、LHarc は compress より 20〜30% くらい圧縮効率が良くなるが、実行時間が 5 倍遅くなる場合がある。squeeze は LHarc に近い圧縮効率と compress に近い実行速度を備えているが消費メモリが 9M バイトに及ぶこともある。squeeze の圧縮率は LHarc に匹敵し、実行速度は compress に近い。しかし最大の欠点は、メモリを多く消費することである。ダイナミックにメモリを割り当てていないので、固定の大きさのエリアを持つ。実行時のメモリ使用量は 9M バイトに及ぶ。

表 圧縮プログラムの種類

プログラム名       開発者
---------------+----------------
arc/arc            SEA
arc/arce           SEA
pkarc/pkxarc       PKware
pkpak/pkunpak      PKware
pkzip/pkunzip      PKware
larc               三木和彦ほか

5. 今月のニュース

 GNU Smalltalk の更新や GNU Emacs 上で動作する電卓パッケージが作成された。また、GNU 一般公的使用許諾に則ったドキュメンテーション・ツール LaTeXinfo がリリースされた。これは texinfo と同様に TeX の GNU 用マクロで、プリンタ出力用とオンライン表示用の両方を 1 つのテキスト・ファイルで実現するが、texinfo 固有のコマンドで記述しなくても LaTeX で使っているコマンドをそのまま記述して、同様の 1 テキスト・ファイルでハードコピーとオンラインの統合化をはかったツールである。◆8

5-1.GNU Emacs 用電卓 (GNU Calc)

 HP-28 電卓の機能をほぼ網羅した GNU Emacs 上で動作する電卓がリリースされた。◆9

●特徴
●入手方法

 次の方法でアクセスするか、または 1〜2 カ月後にニュース・グループ alt.source か comp.sources.misc に投稿される (予定) のを待つ。

方 法 anonymous ftp

マシン名 csvax.caltech.edu

ファイル名 pub/calc ディレクトリの下

5-2.GNU Smalltalk(バージョン 1.1)

●特徴
●動作するマシン
  Apollo 3000/4000/10000
  Atari ST
  ECStation 3100
  Encore Multimax

  HP 9000/300 シリーズ、9000/800 シリーズ

  Interactive 386 System V.3

  SONY NEWS 1800 シリーズ

  Sun-3、Sun-4

  NeXT
  Pyramid
  Sequent
  SGI Iris-4D
  Tektronix 431[5-7]
  VAX
●入手方法

方 法 anonymous ftp

マシン名 prep.ai.mit.edu

ファイル名 pub/gnu/smalltalk-1.1.tar.Z

●提案やバグ報告先

 電子メールにて bug-gnu-smalltalk@prep.ai.mit.e へ。

5-3.LaTeXinfo(バージョン 1.2)

 GNU Emacs バージョン 18 に対応している。

●特徴
●入手方法

 uunet の comp.emacs、comp.test、gnu.emacs というニュース・グループにソース・コードが投稿されていた。

●提案やバグ報告先

 電子メールにて mike@ists.ists.ca へ。

6. おわりに

 ようやく今、この原稿と「GNU ダイジェスト」翻訳・加筆、およびコピー200 部 (USENIX コンファレンス配布用) の作成が終わった。

 今回はカスタマイズについて考えていることをまとめてみた。Emacs の昔話を「GNU の歴史」の前に加えてみたが懐かしい思いでいっぱいである。アーカイブ・プログラムと圧縮アルゴリズムについてざっと書き、最後に GNU tar のコマンド一覧を示した。GNU tar の英文マニュアルはわかりにくいため、今回の付録では少しでもわかりやすくなるように努めた。英文のマニュアルのわかりにくさはプロジェクト GNU でも認めていて、最新「GNU's Bulletin」によると全面的に書き直しているようである。それでは Richard のチュートリアルが楽しみな USENIX コンファレンスに行ってきます。

参考文献

★1

P.D.Stallmen「Free Software の世界 9、GWM-Generic Window Manager」「UNIX MAGAZINE」1990 年 5 月号、アスキー

★2

宮尾正大「PDS の中の言語」「インターフェース」1989 年 7 月号 別冊付録、CQ 出版社

★3

Jay Fenlason, "The GNU tape archive", DRAFT, Free Software Foundation, GNU tar バージョン 1.08 内に含まれているドキュメント

★4

Jordan K.Hubbard, "AWL Another Widget Language",1 January 1990, version 0.9β, AWL の配布ソース・プログラムに含まれているドキュメント

★5

Steve Wright「Interview 岸田孝一、Σを語る」「UNIX MAGAZINE」1987 年 8 月号、アスキー

★6

栗田多喜夫「コンピューティングの玉手箱 (41) ファイル圧縮」「bit」1988 年 5 月号、共立出版

★7

T.A.Welch,"A Technique for High-Performance Data Compression", IEEE COMPUTER, Vol.17, No.6, pp.8〜9(1984)

★8

Victor S. Miller,"Data Compression Algorithms",Proceeding of Symposia in Applied Mathematics, Vol.34(1986)

〈補遺〉GNU tar のオプション一覧

 以下に全ての GNU tar コマンドのリストを示す。これは文献★3 を参考にした。最近の GNU ソフトウェアと同様に「長いオプション名」の機能もサポートしている。これまでの慣習に合わせて同じ 1 文字で示すオプションを最初に示し、「長いオプション名」を括弧内に示す。◆11

●基本オプション

 次のオプションは、tar の基本的な動作を指定するオプションで、いずれかを必ず指定しなければならない。tar の基本動作を変えたい場合は、後述の追加オプションを組み合わせて使う。オプションによっては、その直後に空白を 1 つ挿入して引数が指定可能にしなければならないものがある。

-c(+create)

引数として指定したファイル名を生成する。引数を省略した場合は、現在作業しているディレクトリの全ファイルを生成する。いずれの場合にも同じファイル名が存在すると、上書きされる。

-d(+compare または +diff)

引数として指定したアーカイブ・ファイルとファイル・システムのファイルを比較し、ファイルの大きさやモード、所有者、内容を表示する。引数を省略した場合は、全アーカイブ・ファイルを比較する。

-r(+append)

引数として指定したファイルを、tar が解釈できるアーカイブの最後に追加する。引数のファイル名は省略できない。

-t(+list)

アーカイブ・ファイルのリストを表示する。引数にファイル名を指定した場合は、それだけのリストを表示する。

-u(+update)

-r オプションと似ている。ただし、引数として指定したファイルが、アーカイブの中に存在しない場合やアーカイブの中のバージョンより新しい場合にのみ動作する。引数のファイル名は省略できない。

-x(+extract または +get)

引数として指定したファイルをアーカイブから取り出す。引数を省略した場合は、アーカイブの全ファイルを取り出す。

-A(+catenate または +concatenate)

複数のアーカイブ・ファイルを 1 つにまとめる場合に使う。対象ファイルは全てアーカイブ・ファイルであること。それら全てを作業中のファイルに追加する (対象ファイルは変更しない)。cat コマンドを使ってみたくなるかもしれないが、動作しない。tar のアーカイブの最後には終了のデータが入るが、cat で追加したものにはそれが入らないので無視される。追加されるアーカイブ・ファイルの最後の終了データを取り除いているので正しく動作する。

-D(+delete)

幾つかのアーカイブから削除する。非常に遅い。ただし、磁気テープからファイルを削除する場合は、アーカイブを再書き込みすること。このコマンドを磁気テープのアーカイブに使うと、データがめちゃくちゃになるので、その場合にはアーカイブ・ファイルを完全に書き直す必要がある。

●追加オプション

 次のオプションは、前述の基本オプションと組み合わせて使い、tar の基本動作を変更するために用いる。オプションの直後に空白を 1 つ挿入して引数を指定する。

●いつでも使えるオプション

-b(+block-size)N

N ブロッキング・ファクタを指定する。N×512 バイトのブロック単位にアーカイブの読み書きを行なう。既定のブロッキング・ファクタは通常、20 である。媒体が磁気テープの場合は、大きめのブロックを指定すると、(内部レコードのギャップがほとんどないので) テープに多くのデータを入れられ高いスループットが得られる。ハード (フロッピー)・ディスクの場合は、アーカイブの最後に、多くのヌル・バイトが追加されるので、小さめのブロッキング・ファクタを指定する。

カートリッジ・テープやその他のストリーマ・テープの場合は、かなり大きめのブロッキング・ファクタ (126 上) を指定すると効率が非常に良くなる。ただし、アーカイブの読み込みや更新時には同じブロッキング・ファクタを指定すること。

-f(+file)FileName

FileName にはアーカイブ先のファイル名を指定する。このオプションの指定がなく、環境変数 TAPE が設定されている場合は、その環境変数値が使われる。そうでない場合は、(tar のコンパイル時に選択した) アーカイブ名が使われる (既定値)。その既定値には通常、最初のテープ・ドライブか、あるいはシステム上の転送可能なその他の I/O 媒体が設定されている。FileName を - とした場合は、標準入力からの読み込みか、または標準出力への書き出しとなる。

FileName に :/dev/ を含む場合は、「ホスト名 : ファイル名」の形式として解釈される。ホスト名に @ が含まれていると、「user@ ホスト名 : ファイル名」の形式として扱う。任意のログイン名を指定した場合は、rsh を起動するので、4.3BSD 以外システム上での動作には /etc/rmt を修正する必要がある。◆12

-c または -C(+directory)Dir

Dir に指定したディレクトリに移ってから、tar を実行する。

-M(+multi-volume)

マルチボリューム・アーカイブ・ファイルを扱う場合にこのオプションを用いる。

-N(+after-date)Date

アーカイブを生成する際に、新しいファイルだけを書き込みたい場合に用いる。取り出す場合は、指定された日付、Date より新しいファイルだけが対象となる。指定日以降の修正や inode の変更時間を持つファイルに対してのみ作用する。

引数に空白の入った日付を指定する場合は引用符で囲むこと。getdate を使って日付の部分を解析しているためである。

-R(+record-number)

普通に表示される各メッセージに、対応するアーカイブのレコード番号をつけて表示する。

複数のテープを必要とするファイル・システムのバックアップ・ログをとる時にも便利である。

-T(+files-from)FileName

対象ファイルのリストを表示する。リストはコマンド引数からではなく、FileName に指定したファイル名の内容からとる。FileName に - を指定した場合は、標準入力から対象リストを読み込む。ただし、-c オプションを使わないで -T - や -f -と組み合わせて使うことはできない。

-v(+verbose)

現在作業中の動作について逐次報告、表示する。

+version

標準エラー出力に対してバージョン番号を表示する。

-w(+interactive)

行なおうとする動作ごとにメッセージを端末に表示し、確認を求める。

標準入力からアーカイブを読み込んでいる場合の tar は、確認のためにファイル /dev/tty を用いる。

-X(+exclude)File

File に指定したファイル名から 1 行ごとにファイル名を表す正規表現を読み込み、その正規表現に一致するファイルを操作対象から外す。

-z または -Z(+compress または +uncompress)

compress プログラムを使って、書き込む時にはアーカイブ・ファイルを圧縮し、読み込み時には非圧縮を施す。

起動する compress に対しての引数は与えられないので、与えたい場合はこのオプションを用いるのではなく、compress を明示的に (パイプと組み合わせて) 実行する。

-z オプションは、-M オプションを使った場合や -u や -r、-A、-D コマンドを使った場合には無効になる。◆13

●アーカイブの生成や更新時に使うオプション

-G(+incremental)

ファイル・システムのインクリメンタルなバックアップを行なう。

このオプションを用いると、GNU 版以外の tar プログラムでは読み込むことができないような非標準のアーカイブを生成する。

-h(+dereference)

シンボリック・リンク先のファイルもアーカイブする。ちなみにヘルプの表示は +help オプションを使う。

-l(+one-file-system)

ディレクトリ構造の一部をアーカイブする時に、ファイル・システムの境界 (パーティション) を越えないようにし、そのようなファイルがあった場合にはそれを標準エラー出力で表示する。

Unix の dump コマンドのように、ファイル・システムの全て、あるいは差分バックアップを作成する場合に役立つ。

-o(+old-archive、+old または +portability)

ディレクトリやパイプ、fifo、連続したファイル、デバイス・ファイルに関する情報を入れないで古い形式でアーカイブを書き込む。また、ユーザ名やグループ名ではなく、ユーザ ID やグループ ID の数字を使ってファイルの所有を指定する。

たいていの、古い tar プログラムは新しい形式のアーカイブを読み込むことができるので、アーカイブを更新する場合は、-o を使わないこと。ただし、-o オプションでアーカイブを生成している場合を除く。

-S(+sparse-file)

アーカイブの中に入れた全てのファイルがまばらかどうかをテストし、そうであれば特別なケースとして扱う。

このオプションは dbm ファイルがたくさんある場合に便利である。

-V(+volume)Header

アーカイブ・ファイルの冒頭部分にボリューム・ヘッダーHeader を書き込む。-M オプションと一緒に使う場合は、「Header Volume N」というボリューム・ヘッダーがつく。

-W(+verify)

書き込み後にアーカイブを比較する。全ての相違が標準エラー出力によって報告、表示される。ただし、比較する時はアーカイブがバックスペースの書き込みが可能な媒体に記録されていなければならない。その他のデバイスでは比較できない。

●ファイルのリスト表示や抜き取りのためのオプション

 以下のオプションは -x や -t コマンドを使う場合に重要である。

-B(+read-full-blocks)

アーカイブから、あるブロックを読み込もうとしてそのブロック数分を読み込めない場合に、エラーとして扱われないようにする。

-G(+incremental)

アーカイブが差分バックアップを作成するという意味であるが、付随するコマンドによって動作が異なる。

-t と一緒に使う場合は、tar は、アーカイブの各ディレクトリごとに、生成されたディレクトリ内のファイル・リストを表示する。

-x と一緒に使い、ディレクトリのエントリがある場合は、そのディレクトリ上に現存していたとしても、アーカイブでリスト表示されないファイルは全てディレクトリから削除される。

これは、障害のあるファイル・システムをインクリメンタルなバックアップからリストアする場合に役立つ。

-i(+ignore-zeros)

アーカイブのゼロのブロックを無視する。通常、ゼロのブロックとはアーカイブの最後を示すが、障害のあるアーカイブを読み込んでいる時や、幾つかのアーカイブを一緒に cat してアーカイブ・ファイルが生成された場合に、全体のアーカイブを読み込むことができる。◆14

このオプションで、複数のファイルが 1 つの物理的なテープに保存される場合の正しく読めないというトラブルを避けることができる。

-k(+keep-old-files)

アーカイブと同じ名前のファイルがあれば上書きする。

-k オプションは -t と一緒に使うと無効になる。

-K(+starting-file)FileName

アーカイブの中から指定されたファイル名 FileName を探し、そこから抜き出したり、あるいは FileName のリスト表示を開始する。ディスクが足りないため、指定したファイルの抜き出しに失敗した場合に有効である。

-m(+modification-time)

ファイルが抜き出された時間を、ファイルの修正時間とする。

-t と一緒に使うと無効になる。

-O(+to-stdout)

標準出力に抜き出されたファイルの内容を書き込む。抜き出して、ファイルの内容をパイプ機能で送るといった場合に役立つ。

-t と一緒に使うと無効になる。

-p(+same-permissions または +preserve-permissions)

アーカイブに保存した通りにファイルのモード (アクセス許可) を設定する。

-t と一緒に使うと無効になる。

-P(+absolute-paths)

ファイルのパスに絶対パスを指定することができる (省略時では相対パスに直している)。

+preserve

-p と -s を一緒に指定した場合と同等の効果を得る。短いオプション文字は用意されていない。


Think GNU 連載第 6 回【脚注】

◆1

当時の忙しさだが、USENIX へ向けて小冊子を翻訳、作成、コンファレンス参加、配布という仕事をこなすためであった。 最近は前述最後の 2 つの項目はほかの人に依頼することが多いのでだいぶ楽になった。

◆2

AWL という言語について触れている。これは次の記事も参考になるだろう。

P. D. Stallmen「Free Software の世界 (17)AWL」「UNIX MAGAZINE」1991 年 1 月号、アスキー

◆3

Lisp の方言である Scheme も有望である。使いやすい X 用のパッケージもリリースされているからである。

*1

プルダウン・メニュー…メニューの表示方法の 1 種で、メニューあるいはボタンを選んだ所から下に向かってメニューが表示される形式である。その他「ポップアップ・メニュー」形式などがある。

◆4

GNU Emacs の欠点として、

といった点をあげているが、Epoch や Emacs バージョン 19 では一部あるいは全部をサポートしている (バージョン 19 はまだリリースされてはいない)。

Lucid 社がバージョン 19 の FSF の作業バージョンをベースにした lemacs19 では上述の点をサポートしている。

◆5

ミニコンピュータ上で Emacs を使っていた時代の Emacs ユーザは少数派であった。Emacs を使っていることがすぐわかってしまう。だいぶ後ろからでも端末を見れば、たいていウィンドウが 2 つに分かれているからである。それで当時上司から何度か注意を受けた思い出がある。

◆6

GNU 宣言については、第 2 部を参照のこと。

*2

コアダンプ…プログラムが不正な領域をアクセスしたりゼロの除算を行なうと Unix の世界では、カーネルがそのプログラムのメインメモリやレジスタなどプロセスごとのデータ構造の内容をファイルに書き込む機能を有する。これをコア・ファイルと呼ぶ。計算機のメインメモリが、半導体メモリではなく磁気メモリや磁気コアであったころの呼び名の名残りである。これ以外によく目につくのは tty という文字である。これはテレタイプの略でテレックス用の電動タイプライタに端を発すると記憶している。今ではファックスに押され、テレックスも見かけなくなった。

◆7

「マルチボリューム」とは複数個の媒体のことで、GNU tar では 1 つの媒体に入りきれないアーカイブを複数に分けることができる。

◆8

現在、GNU 一般公有使用許諾と呼んでいる。

◆9

電卓と呼んでいるものの機能的には完全な数式処理システムである。

◆10

「任意の数 M を法とした演算」とは、{0, 1,  . . . , M-1} の有限個の要素を対象に行なう演算のこと。

◆11

「長いオプション名」(long named option) とは、オプションにわかりやすい (理解しやすくするために) 英単語を採用したものである。Unix のオプション名は一般的に、-(マイナス記号) で始まる 1 文字であった。プロジェクト GNU では全てのコマンドに対して意味そのもので覚えやすい長いオプション名も使えるようにしている。

◆12

ローカルにファイルがあるのではなくリモート・ホストにあるものと解釈される。

◆13

GNU tar の `-X File' オプションについて補足する。アーカイブするファイルを指定したり、あるいは取り出すファイルを指定する際に、このコマンドでそれらの操作対象から外す。外すファイル名を正規表現で表した行を File に入れておけばよい。複数行与えられる。

 例えば、

$ tar -c -X exFile

というコマンドを実行する場合を考える。exFile には次のような行が入っているとする。

*〜
#*

そうすると現在注目しているディレクトリより下のもの全てをアーカイブする。ただし、〜 で終了しているファイルと # で開始しているファイル名は除外する。

◆14

「cat コマンドで連結する」という意味である。