为什么同时存在 TMP 和 TEMP 环境变量?(2015)
Source: Hacker News
历史
CP/M (1973)
最早的微型计算机操作系统 CP/M 没有环境变量。因此既没有 TMP 也没有 TEMP 变量。需要临时文件位置的程序只能依赖程序特定的配置,例如在可执行文件中修改一个字节来指示驱动器号。
MS‑DOS (1981)
当 8086 处理器和 MS‑DOS 出现时,设计深受 CP/M 的影响。MS‑DOS 在兼容 CP/M 之外的第一批新增功能之一就是 环境变量。早期的 MS‑DOS 程序是 CP/M 软件的移植版,因而忽略了这些变量。
随着本地 MS‑DOS 应用的出现,开发者开始使用环境变量进行配置。TEMP 和 TMP 两个变量逐渐成为指示临时文件目录的事实标准。
MS‑DOS 2.0 引入了管道功能,MS‑DOS 通过将第一个程序的输出写入临时文件,然后把该文件作为输入传递给第二个程序来模拟管道。为此操作系统使用 TEMP 变量来决定临时文件的创建位置。
不同程序的偏好不同:
DISKCOPY和EDIT会先查找TEMP,如果不存在再查找TMP。- Windows API 函数
GetTempFileName则先检查TMP,再检查TEMP。
Windows
Windows 继承了这两个变量的情况。GetTempFileName 的最初作者更倾向于使用 TMP,因此大多数依赖该 API 的 Windows 程序会使用 TMP 指定的目录,除非它们显式检查 TEMP。
当你打开 Windows 中的 环境变量 对话框时,仍会看到 TMP 和 TEMP 两个条目,它们可能指向不同的位置。实际使用哪个变量取决于程序的实现。
实际要点
- 临时文件使用的目录 取决于程序。
- 如果希望大多数 Windows 应用行为一致,请确保
TMP与TEMP指向同一文件夹。 - 对于传统的 MS‑DOS 实用程序,
TEMP可能是首选变量。