O comportamento de sobregravação padrão de cp
é especificado em POSIX.
If source_file is of type regular file, the following steps shall be taken:
3.a. The behavior is unspecified if dest_file exists and was written by a previous step. Otherwise, if dest_file exists, the following steps shall be taken:
3.a.i. If the -i option is in effect, the cp utility shall write a prompt to the standard error and read a line from the standard input. If the response is not affirmative, cp shall do nothing more with source_file and go on to any remaining files.
3.a.ii. A file descriptor for dest_file shall be obtained by performing actions equivalent to the open() function defined in the System Interfaces volume of POSIX.1-2017 called using dest_file as the path argument, and the bitwise-inclusive OR of O_WRONLY and O_TRUNC as the oflag argument.
3.a.iii. If the attempt to obtain a file descriptor fails and the -f option is in effect, cp shall attempt to remove the file by performing actions equivalent to the unlink() function defined in the System Interfaces volume of POSIX.1-2017 called using dest_file as the path argument. If this attempt succeeds, cp shall continue with step 3b.
Quando a especificação POSIX foi escrita, já existia um grande número de scripts, com uma suposição incorporada para o comportamento padrão de sobrescrever. Muitos desses scripts foram projetados para serem executados sem a presença direta do usuário, por exemplo, como cron jobs ou outras tarefas em segundo plano. Mudar o comportamento teria quebrado eles. Revendo e modificando todos eles para adicionar uma opção para forçar a sobrescrever onde quer que seja necessário, provavelmente foi considerado uma tarefa enorme com benefícios mínimos.
Além disso, a linha de comando do Unix foi sempre projetada para permitir que um usuário experiente trabalhe com eficiência, mesmo à custa de uma difícil curva de aprendizado para um iniciante. Quando o usuário digita um comando, o computador deve esperar que o usuário realmente o queira, sem nenhuma adivinhação; É responsabilidade do usuário ter cuidado com comandos potencialmente destrutivos.
Quando o Unix original foi desenvolvido, os sistemas tinham tão pouca memória e armazenamento em massa que os computadores modernos que sobrescrevem avisos e avisos eram provavelmente vistos como luxos desnecessários e desnecessários.
Quando o padrão POSIX estava sendo escrito, o precedente foi firmemente estabelecido, e os escritores do padrão estavam bem cientes das virtudes de não quebrar a compatibilidade retroativa .
Além disso, como outros descreveram, qualquer usuário pode adicionar / ativar esses recursos para si mesmo, usando aliases de shell ou até mesmo criando um comandocp
de substituição e modificando seu $PATH
para localizar a substituição antes do comando padrão do sistema e obtenha a rede de segurança dessa forma, se desejar.
Mas se você fizer isso, descobrirá que está criando um risco para si mesmo. Se o comando cp
se comportar de uma maneira quando usado interativamente e de outra maneira quando chamado de um script, talvez você não se lembre de que a diferença existe. Em outro sistema, você pode acabar sendo descuidado porque está acostumado aos avisos e prompts de seu próprio sistema.
Se o comportamento em scripts ainda corresponder ao padrão POSIX, você provavelmente se acostumará aos prompts em uso interativo, depois escreverá um script que faz alguma cópia em massa - e então descobrirá que você está novamente sobrescrito inadvertidamente.
Se você aplicar o prompt em scripts também, o que o comando fará quando for executado em um contexto que não tenha nenhum usuário por perto, por exemplo, processos em segundo plano ou cron jobs? O script irá travar, abortar ou sobrescrever?
Suspender ou interromper significa que uma tarefa que deveria ser executada automaticamente não será executada. A não substituição pode, às vezes, também causar um problema: por exemplo, pode fazer com que dados antigos sejam processados duas vezes por outro sistema, em vez de serem substituídos por dados atualizados.
Uma grande parte do poder da linha de comando vem do fato de que uma vez que você saiba como fazer algo na linha de comando, você implicitamente também saberá como fazer isso automaticamente através de scripts . Mas isso só é verdade se os comandos que você usa interativamente também funcionarem exatamente da mesma maneira quando invocados em um contexto de script. Quaisquer diferenças significativas no comportamento entre uso interativo e uso de script criarão uma espécie de dissonância cognitiva que é irritante para um usuário avançado.