É "fazer uma coisa ao mesmo tempo"?
Esse comentário parece uma pergunta sobre um princípio geral de design. Freqüentemente, perguntas sobre isso são muito subjetivas e não somos capazes de escrever uma resposta adequada. Esteja avisado de que podemos fechar perguntas neste caso.
Às vezes, temos uma explicação para a escolha do design original, porque os desenvolvedores escreveram sobre eles. Mas não tenho uma resposta tão boa para esta pergunta.
Por que cp
é projetado dessa maneira?
O problema é que o Unix tem mais de 40 anos.
Se você estava criando um novo sistema agora, poderá fazer diferentes escolhas de design. Mas mudar o Unix quebraria os scripts existentes, como mencionado em outras respostas.
Por que foi cp
projetado para substituir silenciosamente os arquivos existentes?
A resposta curta é "não sei" :-).
Entenda que cp
é apenas um problema. Eu acho que nenhum dos programas de comando originais protegidos contra a substituição ou exclusão de arquivos. O shell tem um problema semelhante ao redirecionar a saída:
$ cat first.html > second.html
Este comando também substitui silenciosamente second.html
.
Estou interessado em pensar em como todos esses programas poderiam ser redesenhados. Pode exigir alguma complexidade extra.
Eu acho que isso faz parte da explicação: o Unix inicial enfatizava implementações simples . Para uma explicação mais detalhada disso, consulte "pior é melhor", vinculado ao final desta resposta.
Você pode alterar > second.html
para parar com um erro, se second.html
já existir. No entanto, como dissemos, por vezes, o usuário não deseja substituir um arquivo existente. Por exemplo, ela pode estar construindo um comando complexo, tentando várias vezes até que faça o que deseja.
O usuário pode executar rm second.html
primeiro se precisar. Este pode ser um bom compromisso! Possui algumas desvantagens possíveis.
- O usuário deve digitar o nome do arquivo duas vezes.
- As pessoas também têm muitos problemas para usar
rm
. Então, eu gostaria de tornar rm
mais seguro também. Mas como? Se rm
mostrarmos cada nome de arquivo e solicitarmos que o usuário confirme, agora ela precisará escrever três linhas de comandos em vez de uma. Além disso, se ela precisar fazer isso com muita frequência, ela adquirirá o hábito e digitar "y" para confirmar sem pensar. Por isso, pode ser muito chato e ainda pode ser perigoso.
Em um sistema moderno, recomendo instalar o trash
comando e usá-lo em vez de rm
onde for possível. A introdução do armazenamento do Lixo foi uma ótima idéia, por exemplo, para um PC gráfico de usuário único .
Eu acho que também é importante entender as limitações do hardware Unix original - RAM e espaço em disco limitados, saída exibida em impressoras lentas , bem como o sistema e o software de desenvolvimento.
Observe que o Unix original não tinha preenchimento de tabulação , para preencher rapidamente um nome de arquivo para um rm
comando. (Além disso, o shell Bourne original não possui histórico de comandos, por exemplo, quando você usa a tecla de seta para cima bash
).
Com a saída da impressora, você usaria o editor baseado em linha ed
,. Isso é mais difícil de aprender do que um editor de texto visual. Você precisa imprimir algumas linhas atuais, decidir como deseja alterá-las e digitar um comando de edição.
Usar > second.html
é um pouco como usar um comando em um editor de linha. O efeito que isso depende depende do estado atual. (Se second.html
já existir, seu conteúdo será descartado). Se o usuário não tiver certeza do estado atual, é esperado que ele seja executado ls
ou ls second.html
primeiro.
"Implementação simples" como princípio de design
Existe uma interpretação popular do design do Unix, que começa:
O design deve ser simples, tanto na implementação quanto na interface. É mais importante que a implementação seja simples que a interface. Simplicidade é a consideração mais importante em um design.
...
Gabriel argumentou que "Pior é melhor" produziu software mais bem-sucedido do que a abordagem do MIT: Enquanto o programa inicial for basicamente bom, levará muito menos tempo e esforço para implementar inicialmente e será mais fácil se adaptar a novas situações. Portar software para novas máquinas, por exemplo, fica muito mais fácil dessa maneira. Assim, seu uso se espalhará rapidamente, muito antes de um programa [melhor] ter a chance de ser desenvolvido e implantado (vantagem do primeiro a mover).
https://en.wikipedia.org/wiki/Worse_is_better