Warum gibt es sowohl die Umgebungsvariablen TMP als auch TEMP? (2015)
(devblogs.microsoft.com)- Unter Windows existieren sowohl
TMPals auchTEMPweiterhin als Angaben für den Speicherort temporärer Dateien, und wenn sie sich unterscheiden, hängt es von der Implementierung des Programms ab, welche verwendet wird - CP/M hatte keine Umgebungsvariablen, daher musste der Speicherort für temporäre Dateien pro Programm festgelegt werden; Programme wie WordStar änderten ihr Verhalten, indem bestimmte Bytes in der ausführbaren Datei gepatcht wurden
- MS-DOS fügte unter starker Berücksichtigung der CP/M-Kompatibilität zwar Umgebungsvariablen hinzu, aber frühe MS-DOS-Programme verwendeten wegen der CP/M-Trägheit
TEMPoderTMPkaum - Als MS-DOS-Programme begannen, Umgebungsvariablen als Mittel zum Speichern von Einstellungen zu verwenden, konkurrierten
TEMPundTMPmiteinander, und einige Programme wieDISKCOPYundEDITsuchtenTEMPvorTMP - Die Pipe-Implementierung in MS-DOS 2.0 entschied sich für
TEMPals Speicherort für temporäre Dateien, aber unter Windows prüftGetTempFileNamezuerstTMP, wodurch beide Variablen weiter nebeneinander bestehen blieben
Der Hintergrund, warum TMP und TEMP beide geblieben sind
- In den Windows-Umgebungsvariablen existieren sowohl
TMPals auchTEMPals Variablen zur Angabe des Speicherorts temporärer Dateien; wenn sie unterschiedlich sind, hängt es vom jeweiligen Programm ab, welche als korrekt angesehen wird - Wo ein bestimmtes Programm seine temporären Dateien anlegt, hängt von dessen Implementierung ab; Windows-Programme verwenden wahrscheinlich die Funktion
GetTempFileName, in diesem Fall hatTMPVorrang - Dass im Dialogfeld für Umgebungsvariablen sowohl
TMPals auchTEMPangezeigt werden, liegt daran, dass sich historisch keine der beiden Optionen vollständig als Standard durchgesetzt hat und unterschiedliche Entscheidungen nebeneinander fortbestanden
CP/M hatte keine Umgebungsvariablen
- Um 1973 war CP/M ein auf Mikrocomputern verbreitetes Betriebssystem, und CP/M hatte keine Umgebungsvariablen
- Da es keine Umgebungsvariablen gab, existierten auch keine Umgebungsvariablen
TMPoderTEMP - Um in einem Programm den Speicherort für temporäre Dateien festzulegen, war eine programmspezifische Konfiguration nötig; typischerweise wurden bestimmte Bytes in der ausführbaren Datei gepatcht, um etwa den Laufwerksbuchstaben festzulegen, auf dem temporäre Dateien abgelegt werden sollten
- Programme wie WordStar dokumentierten im Handbuch, welche Bytes zu patchen waren, um welches Verhalten zu ändern, und boten sogar Patch-Bereiche für benutzerdefinierte Subroutinen etwa zur Druckerunterstützung
MS-DOS und das Aufkommen der Umgebungsvariablen
- 1981 erschienen der 8086-Prozessor und MS-DOS, die beide stark von CP/M beeinflusst waren
- Eines der frühen Designziele von MS-DOS war es, CP/M-Programme für den 8080-Prozessor maschinell in MS-DOS-Programme für den 8086-Prozessor übersetzen zu können
- Dieser Übersetzer setzte voraus, dass keine Sonderfälle wie selbstmodifizierender Code, Sprünge in die Mitte von Instruktionen oder die Verwendung von Code als Daten vorkamen
- Die Register H und L des 8080 entsprachen den Registern BH und BL des 8086, und weil im 8080 nur HL für berechnete Adresszugriffe verwendet werden konnte, durfte beim 8086 unter AX, BX, CX und DX nur BX für Speicherzugriffe verwendet werden
- Zusätzlich zur CP/M-Kompatibilität führte MS-DOS zwar Umgebungsvariablen ein, doch da bestehende CP/M-Programme keine Umgebungsvariablen verwendeten, nutzten auch frühe MS-DOS-Programme sie nicht
- Benutzer konnten zwar
TEMPoderTMPsetzen, aber frühe Programme ignorierten das weitgehend
TEMP und TMP konkurrierten auf dem Markt
- Mit der Zeit wurden Programme geschrieben, die primär auf MS-DOS zielten, und diese begannen, Umgebungsvariablen als Speicher für Konfigurationsdaten zu verwenden
- Als Umgebungsvariablen zur Angabe des Speicherorts temporärer Dateien kamen sowohl
TEMPals auchTMPin Gebrauch, und beide wurden zu wichtigen Kandidaten - Welche Variable zuerst geprüft wurde, hing von der Implementierungsentscheidung des jeweiligen Programms ab
- Viele Programme prüften beide, um möglichst viele Umgebungen abzudecken, aber die Reihenfolge unterschied sich je nach Implementierung
- Ältere Programme wie
DISKCOPYundEDITsuchtenTEMPvorTMP
Die Pipes von MS-DOS 2.0 und TEMP
- MS-DOS 2.0 führte die Pipe-Funktion ein, mit der die Ausgabe eines Programms an die Eingabe eines anderen Programms übergeben werden konnte
- Da MS-DOS ein Single-Tasking-Betriebssystem war, wurden Pipes simuliert, indem die Ausgabe des ersten Programms in eine temporäre Datei umgeleitet, dieses Programm vollständig ausgeführt und danach das zweite Programm mit dieser temporären Datei als Eingabe gestartet wurde
- Dadurch musste MS-DOS selbst einen Ort kennen, an dem temporäre Dateien angelegt werden konnten
- Als Variable zur Steuerung dieses Speicherorts wurde
TEMPgewählt - Auch wenn
COMMAND.COMsich fürTEMPentschied, blieb es anderen Programmen weiterhin selbst überlassen, ob sieTEMPoderTMPverwendeten
Unter Windows entstand ein Pfad mit Vorrang für TMP
- Windows durchlief einen ähnlichen Prozess, doch die frühe Implementierung von
GetTempFileNamewurde so gestaltet, dass sieTMPvorTEMPprüft - Wenn ein Windows-Programm beim Erzeugen temporärer Dateien
GetTempFileNameverwendet, bevorzugt es daher eherTMP - Deshalb gibt es auf die Frage, „welche Variable die richtige ist“, keine einzelne Antwort; es hängt davon ab, welche API oder welche eigene Logik ein Programm verwendet
- Auch heute sind im Dialogfeld für Umgebungsvariablen sowohl
TMPals auchTEMPvorhanden, und beide Variablen bestehen für den Speicherort temporärer Dateien weiterhin nebeneinander
1 Kommentare
Hacker-News-Kommentare
Interessant. Das liegt noch vor meiner Zeit, daher hatte ich nie davon gehört, dass man CP/M-Programme per Patch konfiguriert hat
Mit dieser Funktion habe ich für mein WordStar selbst schnellere Routinen für Tastatur- und Bildschirmausgabe geschrieben
Soweit ich mich erinnere, enthielt die WordStar-7-Dokumentation Patch-Positionen, mit denen man das Programmverhalten über DOS-
debug.exeändern konnteconfig.hund anschließendes Neukompilieren konfigurierthttps://suckless.org/
Nachtrag: Ich habe erst später gesehen, dass das in einem anderen Unterthread auf dieser Seite schon erwähnt wurde
Viele CP/M-Programme mussten mit 32K RAM und langsamen 130K-Disketten laufen, im Extremfall sogar auf Kassetten. Wer 64K RAM und 360K Speicher hatte, war schon ziemlich privilegiert
Damals optimierte man Programme, anders als heute, nicht für das obere Ende des Marktes, sondern für das untere. Je mehr Systeme unterstützt wurden, desto mehr konnte man verkaufen, ohne den Kunden ein Hardware-Upgrade aufzudrängen
Für externe Konfigurationsdateien oder Programme zu deren Erstellung war schlicht kein Platz da, und selbst das Parsen von Kommandozeilenargumenten verbrauchte wertvolle Bytes
Heute beklagt man sich darüber, dass ein MacBook Neo nur 8.000.000.000 Byte RAM habe, aber 1978 konnte man sogar eine IDE mit 2.048 Byte bauen
Ich mag Raymonds Blog, aber die Behauptung, CP/M sei 1973 auf Mikrocomputern verbreitet gewesen, ist seltsam
Die Mikrocomputer von 1973 waren eher Prototypen auf dem Niveau von Entwicklungssystemen wie dem Intel Intellec und hatten überhaupt kein Betriebssystem. Dass Kildall 1973 mit der Entwicklung von CP/M begann, stimmt zwar, aber damals lief es nur auf einem Simulator auf einem PDP-10-Mainframe
1979 würde Sinn ergeben, aber 1973 ist viel zu früh
Wenn man das so sieht, merkt man plötzlich, dass es 2020 noch kein ChatGPT gab
Ein gutes Beispiel dafür, wie eine Entscheidung eines frühen Entwicklers, fast ohne Nachdenken getroffen, jahrzehntelang bestehen bleibt
attorniesheißen. Am Anfang hat einfach niemand den Tippfehler bemerktDass Programme
TMPgewählt haben, liegt wahrscheinlich daran, dass Dateierweiterungen unter MS-DOS höchstens drei Zeichen lang sein durften und man für temporäre Dateien üblicherweise die Erweiterung.TMPverwendeteÄhnlich wie bei Unix-Programmen, die nicht konsistent darin waren, ob sie
http_proxyoderHTTP_PROXYbeachtenHeute prüfen viele Programme beide, aber nicht unbedingt in derselben Reihenfolge
Die Erwähnung von CP/M ist verwirrend. Der Autor sagt erst, es werde später wichtig, erklärt dann aber am Ende offenbar, dass es nichts mit CP/M oder der 8080-CPU zu tun hatte
Der Kernpunkt ist nur, dass Microsoft es selbst verwendet hat, aber nie daran dachte, es zu standardisieren
TMPoderTEMPverwendet, und DOS hätte sich daran orientiertDas eigentliche Hindernis war aber, dass CP/M keine Verzeichnisse hatte und DOS 1.0 ebenfalls nicht
Um 1995 herum hatte Telstra, also Australia Telecom, unternehmensweit etwa 50.000 Desktop-Rechner
Eines Tages tauchte im Netzwerk-Home-Verzeichnis aller ein kleines File namens
nullauf, und vermutlich hatte ein Unix-Benutzer versucht, eine.bat-Datei zu schreibenDas führt zurück zur Frage, warum man einem bestehenden Standard folgen sollte. Ich wollte schon fragen: „Warum standardisieren?“, dachte dann aber, das könnte Nordamerikaner verwirren
/dev/nullversucht, das hat nicht funktioniert, und dann einfach aufnullgewechseltSonst ergibt es keinen Sinn, dass es ein Unix-Programmierer gewesen sein soll. Eher hat ein DOS-Programmierer
NULfälschlich alsnullgeschriebenEs suchte auf der Festplatte nach einer Datei namens
NULL, und natürlich stand in der.BAT-Datei etwas wie> NULLEhrlich gesagt wäre mir bei vielen Programmen die CP/M-artige Patch-Konfiguration lieber als die Praxis, Dotfiles im Home-Verzeichnis zu verstreuen
Immer mehr Projekte übernehmen das, sogar solche, die sich lange gesträubt haben, wie Firefox
Aus moderner Open-Source-Sicht kann man das als ähnlichen Ansatz sehen. Wegen des allgemeinen Asketismus sind die Projekte aber wohl Geschmackssache
.configliegenDas Problem ist, dass viele App-Entwickler meinen, gerade ihre App sei so besonders, dass sie ein eigenes Verzeichnis verdiene
grepdurchsuchen und mit einem Texteditor verwalten kann, besser als Konfigurationen, die über irgendeine zentrale binäre Registry verstreut sindVielleicht liegt das auch einfach daran, dass ich daran gewöhnt bin
.config-Ordner irgendwie erzwingen kann, wäre das für mich ein GewinnerAndererseits könnte der richtige Zeitpunkt dafür längst verpasst sein
Ich wusste nicht, dass das so verwirrend ist
Die Lehre daraus ist wohl: Lass immer beide auf denselben Pfad zeigen, sonst gibt es Ärger
Ich weise seit Jahrzehnten auf solche nervigen Microsoft-Dinge hin
Früher gab es dort immer einen „Senior Developer“, der so tat, als wüsste er alles, und für alles eine Antwort hatte. Dann hieß es etwa: „
tempsteht für temporary undtmpfür troubleshoot my pc, das ist für Debug-Logs. Deshalb bin ich Senior und du nicht.“Als ich selbst seniorer wurde, stellte sich heraus, dass meine Zweifel berechtigt waren, und wenn man heute mit den ursprünglichen Microsoft-Entwicklern spricht, erklären sie, es sei ein Fehler gewesen, aber aus Gründen der Abwärtskompatibilität beibehalten worden
Dann fragt man sich allerdings, warum diese Ausrede gültig sein soll, wenn man unter Berufung auf Abwärtskompatibilität argumentiert, aber gleichzeitig Änderungen wie bei New Outlook trotzdem durchdrückt, obwohl sie Kernkompatibilität und echte Arbeitsabläufe regelmäßig kaputtmachen. Dann ziehen sie sich darauf zurück: „Ich bin kein schlechter Entwickler, frag die Neuen“
Die Neuen kann man aber gar nicht fragen, sie verstecken sich hinter LeetCode-Auswahlhürden. Deshalb werden solche realen Probleme nie behoben, und Dinge wie New Outlook entstehen überhaupt erst. Der damalige Senior Developer arbeitet jetzt wahrscheinlich dort, und die echten Entwickler sind in Rente
Selbst wenn man von Microsoft eine halbwegs plausible Antwort darauf bekommt, warum irgendwelche Programme den Documents-Ordner des Benutzers unangemessen verwenden oder OneDrive ihn versehentlich zwangsweise leert, wird diese Kernlogik innerhalb von sechs Monaten wieder untergraben, weil Microsoft irgendeine zufällige Änderung einspielt, die das Verhalten in eine schlechtere Richtung verschiebt
Bei Notepad ähnlich: In Entwicklerinterviews hieß es, das Risiko müsse null sein, deshalb müsse es ein extrem einfaches Programm bleiben, und später bekam es dann Microsoft-Konto-Anmeldung und Copilot
Ich denke, diese LeetCode-Mentalität von Entwicklern und die Microsoft-Kultur ruinieren die ganze Branche. Eine sachliche Diskussion ist nicht möglich, stattdessen läuft es auf „Du arbeitest nicht bei Microsoft, also ist dein Argument ungültig“ hinaus
Ich erinnere mich noch gut daran, wie Google Chrome nach
AppDatainstalliert wurde, um Administratorrechte zu umgehen. Offensichtlich war diese Funktion ursprünglich nicht dafür gedacht, dass Dritte ohne Administratorrechte Software installierenAber Chrome war damals gut, und man musste irgendwie das Chaos bewältigen, Drittanbieter-Ausnahmen auf Millionen gesperrter Firmenrechner zu verteilen, also wird das von Entwicklern heute im Nachhinein als beabsichtigte Funktion umgedeutet