As versões originais do UNIX 5-7 podem ser vistas fazendo a mesma coisa. ( UFD output = 2;
link )
time
é / foi construído, e é definitivamente útil que seja gerado para stderr. No entanto time
não é um dos builtins da V5.
Eu não acho que tenha havido grandes razões não para gravar saída de terminal para stderr. A saída do shell era claramente uma mensagem de erro ou saída destinada apenas a terminais interativos. Não foi necessário redirecionar o stdout para redirecionar a saída interativa.
Embora stderr tenha sido introduzido em V6, não V5, em V5 sh
manualmente dup()
s stdout para FD 2 após fechar o antigo FD 2 se necessário. Parece que eles já encontraram a necessidade de imprimir mensagens de erro, por exemplo if exec()
falhou ao tentar iniciar um comando como foo > output
.
Agora, preste atenção em como compact é o código unix histórico. É deliberadamente mantido curto, porque não havia necessariamente muita RAM física.
Existe uma única função prs()
para imprimir cadeias. Não é necessário um parâmetro FD. Ele imprime mensagens de erro para FD 2, e as outras strings também estão OK para imprimir em FD 2, então simplesmente imprime em FD 2 incondicionalmente. Código curto, que compila poucas instruções, portanto, usando o mínimo de RAM.
E uma vez que as coisas estão por aí por algum tempo, mudando elas sempre correm o risco de quebrar mais coisas do que melhora.
O que me intriga é por que os desenvolvedores de python perceberam isso e copiaram - IMO é um fato bem obscuro. Talvez isso implique uma razão adicional que não encontrei.
err(s)
char *s;
{
prs(s);
prs("\n");
if(promp == 0) {
seek(0, 0, 2);
exit();
}
}
prs(as)
char *as;
{
register char *s;
s = as;
while(*s)
putc(*s++);
}
putc(c)
{
write(2, &c, 1);
}