是“一次做一件事”吗?
这个评论听起来像是关于一般设计原则的问题。通常,关于这些的问题是非常主观的,我们无法写出正确的答案。请注意,在这种情况下我们可能会关闭问题。
有时我们会解释原始的设计选择,因为开发人员已经撰写了有关它们的文章。但是我对这个问题没有很好的答案。
为什么cp
这样设计?
问题是Unix已经有40多年的历史了。
如果现在要创建新系统,则可能会做出不同的设计选择。但是,如其他答案所述,更改Unix会破坏现有的脚本。
为什么被 cp
设计默默地覆盖现有文件?
简短的答案是“我不知道” :-)。
明白那cp
只是一个问题。我认为没有一个原始命令程序可以防止覆盖或删除文件。重定向输出时,shell存在类似的问题:
$ cat first.html > second.html
该命令也将默默覆盖second.html
。
我有兴趣考虑如何重新设计所有这些程序。这可能需要一些额外的复杂性。
我认为这是解释的一部分:早期的Unix强调简单的实现。有关此问题的更详细说明,请参见此答案末尾的“越差越好”。
您可以进行更改,> second.html
以使其停止并显示错误(如果second.html
已存在)。但是,正如我们提到的,有时用户确实希望替换现有文件。例如,她可能正在建立一个复杂的命令,尝试几次直到它执行她想要的操作。
rm second.html
如果需要,用户可以先运行。这可能是一个不错的折衷方案!它本身具有一些可能的缺点。
- 用户必须键入两次文件名。
- 人们在使用时也会遇到很多麻烦
rm
。所以我也想变得rm
更安全。但是如何?如果我们rm
显示每个文件名,并要求用户确认,她现在已经写3行一个命令,而不是。另外,如果她必须经常这样做,她会养成习惯,然后键入“ y”进行确认,而不用思考。因此,这可能非常烦人,并且仍然很危险。
在现代系统上,我建议安装trash
命令,并rm
尽可能使用它。垃圾存储的引入是一个好主意,例如对于单用户图形PC而言。
我认为了解原始Unix硬件的局限性也很重要-有限的RAM和磁盘空间,在慢速打印机上显示的输出 以及系统和开发软件。
请注意,原始Unix没有制表符完成功能,无法快速填写rm
命令的文件名。(此外,原始的Bourne shell没有命令历史记录,例如,当您使用中的向上箭头键时bash
)。
对于打印机输出,您将使用基于行的编辑器ed
。这比视觉文本编辑器更难学习。您必须打印一些当前行,决定如何更改它们,然后键入编辑命令。
使用> second.html
有点像在行编辑器中使用命令。其效果取决于当前状态。(如果second.html
已经存在,其内容将被丢弃)。如果用户不确定当前状态,则应该先运行ls
还是ls second.html
先运行。
以“简单实现”为设计原则
Unix设计有一个流行的解释,它开始于:
设计必须在实现和接口上都简单。简单的实现比接口更重要。简洁是设计中最重要的考虑因素。
...
加布里埃尔认为,“更好的解决方案”比MIT的方法生产的软件更成功:只要初始程序基本上是好的,那么最初实施所需的时间和精力将大大减少,并且更容易适应新情况。例如,通过这种方式将软件移植到新机器变得容易得多。因此,在[更好]程序有机会开发和部署之前(先行者优势),它的使用将迅速传播。
https://en.wikipedia.org/wiki/Worse_is_better