世界を動かす技術を、日本語で。

TMPとTEMPの環境変数が両方存在するのはなぜか? (2015)

概要

  • 環境変数 TMPTEMP は、一時ファイルの保存場所を指定するために存在
  • 歴史的経緯により、どちらを使うかはプログラムごとに異なる
  • MS-DOSとWindowsの進化の中で両者が併存
  • 一部プログラムは両方をチェックし、優先順位もまちまち
  • Windowsでは GetTempFileName 関数が TMP を優先

TMPとTEMP:一時ファイル用環境変数の歴史

  • 1973年当時、 CP/M には環境変数が存在しなかった

    • 一時ファイルの保存先は、プログラムごとに 実行ファイルのバイトを書き換えて設定
  • WordStar のようなCP/Mプログラムは、マニュアルにパッチ方法を記載

    • 独自サブルーチン用のパッチスペースも確保
    • プリンタ制御などのカスタマイズ例
  • 1981年、 8086プロセッサMS-DOS が登場

    • 設計目標は CP/Mプログラムの機械翻訳による移植性
    • 8080のHLレジスタが8086のBXレジスタに対応
    • 移植性重視のため、MS-DOS初期プログラムは 環境変数を利用しなかった
  • MS-DOSが進化し、 環境変数 の導入

    • 新規開発プログラムが設定情報として 環境変数 を利用
    • 一時ファイル保存先として TEMPTMP が登場し、両者が主流に
  • MS-DOS 2.0 でパイプ機能追加

    • 一時ファイルの保存先に TEMP を採用
    • しかし、他プログラムは TEMP または TMP のどちらか、あるいは両方をチェック
    • DISKCOPYEDIT はTEMP→TMPの順で確認

Windows時代のTMPとTEMP

  • Windowsでは GetTempFileName 関数が TMP を優先
    • Windowsプログラムはこの関数を利用することが多い
  • 環境変数設定画面には今も TMPTEMP が併記
    • どちらが使われるかは プログラム次第
    • まさに「Adidas対Puma」のような共存状態

著者情報

  • 著者 Raymond は30年以上Windows進化に関与
    • 2003年にWebサイト「 The Old New Thing」を開設
    • サイトは予想以上の人気を博し、書籍化も実現(Addison Wesley 2007年)
    • Windows Dev Docs Twitterでも時折登場し、ユーモラスなエピソードを発信

Hackerたちの意見

1995年頃かな。テレストラ(オーストラリアの通信会社)。組織全体で約5万台のデスクトップコンピュータがあった。ある日、みんなのネットワークのホームディレクトリに「null」っていう小さなファイルが現れたんだ。どうやら* nixの人が.batファイルを書こうとしたみたい。なんで既存の標準を採用する必要があるんだろう?(「標準化する理由は?」って聞こうと思ったけど、北米の人たちを混乱させるかもって気づいた。 : )

ある日、みんなのネットワークのホームディレクトリに「null」っていう小さなファイルが現れた。* nixの人が.batファイルを書こうとしたみたいだけど、最初は/dev/nullを試して失敗したから、ただのnullにしたのかな?そうじゃないと、Unixプログラマーがこんなことするのはおかしいよね。むしろ、DOSプログラマーがNULを「null」と間違えた可能性が高い。

彼が捨てようとしたテキストには何が書いてあったの?

あるLogitechのドライバインストールプログラム(どのバージョンか、どの製品かは不明だけど)もそうだった…HDにNULLという名前のファイルが見つかって、もちろん何かが> NULLというBATファイルもあったよ。

そんなにカオスだったとは知らなかった。だから、この話の教訓は、常に同じパスを指すようにしないと、どうなるかってことかな…。

私の記憶では、ほとんどのCP/Mプログラムはパッチで設定されていた。少なくとも、私はそうやって設定してた。WordStarのマニュアルには、何をするためにどのバイトをパッチすればいいかの詳細が載ってたのを覚えてる。プリンターのカスタムサポートを追加する必要がある場合に備えて、自分のサブルーチンを書くためのパッチスペースも数十バイト用意されてた。へぇ、面白いね。私の時代の前の話だし、これについては聞いたことなかった :D

うん、確かにそういうことがあった。パッチコードはZ80/8080のマシンコードで書かなきゃいけなかった。私はこの機能を使って、自分のWordstarのために高性能なキーボードとディスプレイのルーチンを書いたよ。

「私の記憶では、ほとんどのCP/Mプログラムはパッチで設定されていた。」 へぇ、それは面白いね。私の時代の前のことだから、聞いたことなかったよ :D そうそう、実際にあったんだよ。元々CP/M用のプログラム(例えば、DOS用のWordStar 7.0)では、長い間続いてた。WordStar 7のドキュメントには、プログラムの動作を変更するために使うパッチの場所が載ってたよ(確か、DOSのdebug.exe用だったと思う)。

そういうのは今でもあるよ。sucklessが書いてるものは、一般的にconfig.hを変更して再コンパイルすることで設定されるんだ。https://suckless.org/ 編集: あ、これがこのページの別のスレッドで既に言及されてたのを見逃してた。

それは面白いね。私の時代の前のことだから、聞いたことなかったよ。RAMとディスクスペースがすごく限られてたから必要だったんだよね。ほとんどのコンピュータにはアセンブラが付いてきたし、多くのCP/Mプログラムは32KのRAMと130Kの遅いフロッピーディスクで動くことが期待されてた。もっとひどいのはカセットテープからだったり。64KのRAMと360Kのディスクがあったら、特別な存在だったんだよ。今とは違って、ほとんどのプログラムは市場の底辺向けに最適化されてた。できるだけ多くのシステムで動かないと、もっと多くのコピーを売れなかったからね。人にハードウェアをアップグレードしろなんて言わなかった。失敗は自分の責任で、顧客のせいじゃなかった。外部設定ファイルやその設定ファイルを生成するプログラムを置く余裕なんてなかったんだ。一般的な機能はコマンドラインパラメータでアクセスできたけど、そのロジックも貴重なバイトを消費してた。今の人たちは、MacBook Neoが8,000,000,000バイトのRAMしかないって文句言ってるけど、そんな限られたスペースじゃ何もできないって。でも1978年には、2,048バイトで基本的なIDE全体を書けたんだよ。

私の記憶では、ほとんどのCP/Mプログラムはパッチで設定されていた。正直言って、私のホームディレクトリに散らばってるドットファイルより、こういう設定の方が好きだったな。

そういうの、標準化されてほしいな。何とかして.configフォルダーを強制できるディストリビューションがあれば、私にとっては最高だね。でも、もうチャンスを逃しちゃったかも。

Hacker Newsで議論の続きを見る