Por que as variáveis de ambiente TMP e TEMP existem ao mesmo tempo? (2015)
(devblogs.microsoft.com)- No Windows, ainda existem tanto
TMPquantoTEMPpara indicar a localização de arquivos temporários, e quando os dois são diferentes, qual deles é usado depende da implementação do programa - O CP/M não tinha variáveis de ambiente, então a localização dos arquivos temporários precisava ser configurada por programa, e softwares como o WordStar mudavam o comportamento aplicando patch em bytes específicos do executável
- O MS-DOS foi criado com forte preocupação com a compatibilidade com o CP/M e também adicionou variáveis de ambiente, mas os primeiros programas de MS-DOS quase não usavam
TEMPouTMPpor inércia herdada do CP/M - À medida que programas de MS-DOS passaram a usar variáveis de ambiente para armazenar configurações,
TEMPeTMPpassaram a competir, e alguns programas comoDISKCOPYeEDITprocuravamTEMPantes deTMP - A implementação de pipes no MS-DOS 2.0 escolheu
TEMPpara a localização de arquivos temporários, mas oGetTempFileNamedo Windows verificaTMPprimeiro, fazendo com que as duas variáveis continuem coexistindo
O contexto de por que TMP e TEMP continuam existindo
- Nas variáveis de ambiente do Windows, existem tanto
TMPquantoTEMPpara definir a localização de arquivos temporários, e se os dois forem diferentes, qual deles está “certo” varia de programa para programa - O local onde um programa específico cria arquivos temporários depende da implementação desse programa; programas Windows provavelmente usam a função
GetTempFileName, e nesse casoTMPtem prioridade - O motivo de
TMPeTEMPaparecerem juntos na caixa de diálogo de variáveis de ambiente é que nenhum dos dois foi totalmente consolidado como padrão, e historicamente escolhas diferentes continuaram coexistindo
O CP/M não tinha variáveis de ambiente
- Por volta de 1973, o sistema operacional comum em microcomputadores era o CP/M, e o CP/M não tinha variáveis de ambiente
- Como não havia variáveis de ambiente, também não existiam as variáveis
TMPouTEMP - Para definir onde salvar arquivos temporários em um programa, era preciso configurar isso individualmente, por exemplo aplicando patch em bytes específicos do executável para indicar a letra da unidade onde os arquivos temporários seriam colocados
- Programas como o WordStar traziam no manual quais bytes precisavam ser alterados para mudar determinado comportamento, e também ofereciam espaço de patch para incluir sub-rotinas personalizadas, como suporte a impressora
O surgimento do MS-DOS e das variáveis de ambiente
- Em 1981 surgiram o processador 8086 e o MS-DOS, ambos fortemente influenciados pelo CP/M
- Um dos objetivos iniciais de projeto do MS-DOS era permitir a tradução mecânica de programas CP/M para processador 8080 em programas MS-DOS para processador 8086
- Esse tradutor partia do pressuposto de que não seriam usados truques fora do padrão, como código auto-modificável, saltos para o meio de instruções ou uso de código como dados
- Os registradores H e L do 8080 correspondiam aos registradores BH e BL do 8086, e o fato de no 8080 apenas o registrador HL poder ser usado para acesso a endereços calculados ajudou a explicar por que, no 8086, entre AX, BX, CX e DX, só BX podia ser usado para acesso à memória
- Além da compatibilidade com CP/M, o MS-DOS adicionou variáveis de ambiente, mas como os programas CP/M existentes não as usavam, os primeiros programas de MS-DOS também não usavam variáveis de ambiente
- O usuário podia definir
TEMPouTMP, mas os programas iniciais simplesmente não davam atenção a isso
TEMP e TMP passaram a competir no mercado
- Com o tempo, começaram a surgir programas voltados principalmente para MS-DOS, e eles passaram a usar variáveis de ambiente como forma de armazenar dados de configuração
TEMPeTMPcomeçaram então a ser usados como variáveis de ambiente para indicar a localização de arquivos temporários, e ambos surgiram como principais candidatos- Qual variável verificar primeiro dependia da escolha de implementação de cada programa
- Muitos programas verificavam as duas para atender aos dois casos, mas a ordem de prioridade variava conforme a implementação
- Programas antigos como
DISKCOPYeEDITprocuravamTEMPantes deTMP
Os pipes do MS-DOS 2.0 e TEMP
- O MS-DOS 2.0 introduziu o recurso de pipe, que permite passar a saída de um programa para a entrada de outro
- Como o MS-DOS era um sistema operacional monotarefa, ele simulava pipes redirecionando a saída do primeiro programa para um arquivo temporário, executando-o até o fim e depois rodando o segundo programa para ler desse arquivo temporário
- Por causa desse recurso, o próprio MS-DOS passou a precisar de um local para criar arquivos temporários
- A variável escolhida para controlar esse local foi
TEMP - Mesmo que o
COMMAND.COMtenha escolhidoTEMP, continuava sendo decisão de cada programa usarTEMPouTMP
No Windows surgiu um caminho em que TMP tem prioridade
- O Windows passou por processo parecido, mas a implementação inicial de
GetTempFileNamefoi criada para verificarTMPantes deTEMP - Quando um programa Windows usa
GetTempFileNamepara criar arquivos temporários, ele tende a preferirTMP - Portanto, não existe uma resposta única para “qual variável está certa”; isso depende de qual API ou lógica própria o programa usa
- Até hoje, a caixa de diálogo de variáveis de ambiente continua mostrando tanto
TMPquantoTEMP, e as duas variáveis seguem coexistindo na definição da localização de arquivos temporários
1 comentários
Comentários do Hacker News
Interessante. É de antes da minha época, então eu nunca tinha ouvido falar de configurar programas de CP/M por patch
Usei esse recurso para escrever eu mesmo rotinas mais rápidas de teclado e saída de tela no meu WordStar
Lembro que a documentação do WordStar 7 incluía posições de patch que podiam ser usadas com o
debug.exedo DOS para mudar o comportamento do programaconfig.he recompilandohttps://suckless.org/
Aliás, só depois percebi que isso já tinha sido mencionado em outra subthread desta página
Muitos programas de CP/M precisavam rodar com 32K de RAM e disquetes lentos de 130K, ou até em fita cassete nos casos piores. Ter 64K de RAM e disco de 360K já era algo bem especial
Naquela época, ao contrário de hoje, os programas eram otimizados para a base do mercado, não para o topo. Quanto mais sistemas suportassem, mais vendiam, e não empurravam para o cliente a obrigação de fazer upgrade de hardware
Simplesmente não havia espaço para arquivos de configuração externos nem para um programa que criasse esses arquivos, e até processar argumentos de linha de comando consumia bytes preciosos
Hoje em dia o pessoal reclama que um MacBook Neo tem só 8.000.000.000 bytes de RAM, mas em 1978 já dava para fazer uma IDE básica de 2.048 bytes
Gosto do blog do Raymond, mas dizer que CP/M era comum em microcomputadores em 1973 soa estranho
Os microcomputadores de 1973 eram mais protótipos no nível de sistemas de desenvolvimento como o Intel Intellec, e nem tinham sistema operacional. É verdade que o Kildall começou a desenvolver o CP/M em 1973, mas naquela época ele só rodava em um simulador num mainframe PDP-10
Em 1979 tudo bem, mas 1973 é cedo demais
Aí você percebe que em 2020 ainda não existia ChatGPT
Um bom exemplo de como uma decisão tomada por um desenvolvedor no começo, quase sem pensar, pode perdurar por décadas
attorniespara sempre, porque ninguém percebeu o erro no inícioÉ bem provável que os programas tenham escolhido
TMPpor causa da limitação de 3 caracteres nas extensões de arquivo do MS-DOS e da convenção de usar a extensão.TMPem nomes de arquivos temporáriosParece o caso dos programas Unix que nunca foram consistentes sobre olhar
http_proxyouHTTP_PROXYHoje muitos programas verificam ambos, mas a ordem de verificação pode não ser a mesma
A referência a CP/M me confundiu. O autor parece dizer que isso seria importante depois, mas no fim explica que não tinha relação com CP/M nem com a CPU 8080
O ponto central é só que a Microsoft usava isso internamente e não pensou em padronizar
TMPouTEMP, e o DOS teria seguido issoSó que o verdadeiro obstáculo é que o CP/M não tinha diretórios, e o DOS 1.0 também não
Por volta de 1995, a Telstra, ou Australia Telecom, tinha algo como 50 mil desktops na organização inteira
Um dia, apareceu um pequeno arquivo chamado
nullno diretório home de rede de todo mundo, e aparentemente um usuário de Unix tinha tentado escrever um arquivo.batÉ disso que se trata não seguir um padrão que já existe. Eu queria perguntar “por que padronizar?”, mas achei que isso talvez confundisse os norte-americanos
/dev/nullprimeiro, falhou, e aí trocaram só paranullCaso contrário, não faz sentido culpar um programador Unix. Seria mais provável um programador DOS ter escrito
nullpor engano no lugar deNULProcurava um arquivo chamado
NULLno disco rígido e, claro, havia algo como> NULLdentro de um arquivo.BATSinceramente, acho que em muitos programas a configuração por patch no estilo CP/M teria sido melhor do que espalhar dotfiles pelo diretório home
Cada vez mais projetos estão adotando isso, inclusive alguns que resistiam, como o Firefox
Dá para dizer que é uma abordagem parecida em termos modernos de open source. Só que, pelo ascetismo geral, os projetos provavelmente agradam mais a certos gostos do que a outros
.configO problema é que muitos desenvolvedores de apps acham que o app deles é especial o bastante para merecer um diretório separado
grepe editar com um editor de texto a configurações espalhadas por um registro binário centralTalvez seja só costume
.config, para mim já é vencedoraEmbora talvez já tenhamos perdido o timing para isso
Eu não fazia ideia de que isso era tão confuso assim
A lição provavelmente é: faça tudo apontar sempre para o mesmo caminho, ou vai dar problema
Venho apontando essas coisas irritantes da Microsoft há décadas
Antigamente sempre havia algum “desenvolvedor sênior” de lá que parecia saber tudo e tinha a resposta pronta. Era aquele tipo de coisa: “
tempé temporary etmpé troubleshoot my pc, usado para logs de depuração. Por isso eu sou sênior e você não”Quando fiquei mais sênior, percebi que eu estava certo em questionar, e agora, falando com os desenvolvedores originais da Microsoft, eles explicam que foi um erro, mas foi mantido por compatibilidade retroativa
Só que aí eu pergunto por que essa desculpa valeria, se ao mesmo tempo eles continuam empurrando mudanças que quebram compatibilidade essencial e fluxos reais de trabalho, como aconteceu com o New Outlook. Aí vem a resposta padrão de “eu não sou um mau desenvolvedor, pergunte para o pessoal novo”
Só que nem dá para perguntar para o pessoal novo, porque eles estão escondidos atrás da barreira de seleção estilo LeetCode. Então não é surpresa que esses problemas reais nunca sejam corrigidos e que coisas como o New Outlook acabem surgindo. Aquele desenvolvedor sênior de antes agora trabalha lá, e os desenvolvedores de verdade já se aposentaram
Mesmo quando a Microsoft dá uma resposta aparentemente razoável sobre o uso indevido da pasta Documents do usuário por programas aleatórios, ou sobre o OneDrive apagá-la à força por engano, em menos de 6 meses a empresa empurra alguma mudança aleatória que piora o comportamento e destrói toda a lógica central da explicação
O Notepad é parecido. Em entrevistas com desenvolvedores, diziam que ele precisava ser um programa extremamente simples porque o risco tinha de ser zero, e depois acabaram colocando login de conta Microsoft e Copilot nele
Acho que essa mentalidade de desenvolvedor estilo LeetCode, junto com a cultura da Microsoft, estragou a indústria inteira. Não dá para ter uma discussão tranquila; tudo vira “você não trabalha na Microsoft, então seu argumento não vale”
Também lembro bem de quando o Google Chrome era instalado em
AppDatapara contornar privilégios de administrador. Claramente a intenção original desse recurso não era permitir que terceiros instalassem coisas sem privilégios de administradorMas, como o Chrome era bom na época e alguém precisava lidar com a confusão de distribuir programas de exceção de terceiros para milhões de computadores corporativos bloqueados, os desenvolvedores agora tentam reembalar isso como se fosse funcionalidade intencional