É "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.htmlpara parar com um erro, se second.htmljá 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.htmlprimeiro 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 rmmais seguro também. Mas como? Se rmmostrarmos 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 trashcomando e usá-lo em vez de rmonde 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 rmcomando. (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.htmljá existir, seu conteúdo será descartado). Se o usuário não tiver certeza do estado atual, é esperado que ele seja executado lsou ls second.htmlprimeiro.
"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