Это "сделать одну вещь за один раз"?
Этот комментарий звучит как вопрос об общем принципе дизайна. Часто вопросы по этому поводу очень субъективны, и мы не можем дать правильный ответ. Имейте в виду, что в этом случае мы можем закрыть вопросы.
Иногда у нас есть объяснение первоначального выбора дизайна, потому что разработчики написали о них. Но у меня нет такого хорошего ответа на этот вопрос.
Почему cp
так устроено?
Проблема в том, что Unix старше 40 лет.
Если бы вы создавали новую систему сейчас, вы могли бы сделать другой выбор дизайна. Но изменение Unix сломало бы существующие сценарии, как упомянуто в других ответах.
Почему был cp
разработан, чтобы молча перезаписать существующие файлы?
Краткий ответ: «Я не знаю» :-).
Поймите, что cp
это только одна проблема. Я думаю, что ни одна из оригинальных командных программ не защищена от перезаписи или удаления файлов. Оболочка имеет аналогичную проблему при перенаправлении вывода:
$ cat first.html > second.html
Эта команда также молча перезаписывает second.html
.
Мне интересно подумать, как все эти программы могут быть переработаны. Это может потребовать дополнительной сложности.
Я думаю, что это часть объяснения: ранний Unix подчеркивал простые реализации . Более подробное объяснение этого см. В разделе «Чем хуже, тем лучше», ссылка на который приведена в конце этого ответа.
Вы можете изменить > second.html
его, чтобы он остановился с ошибкой, если она second.html
уже существует. Однако , как мы уже упоминали, иногда пользователь делает хочет заменить существующий файл. Например, она может создавать сложную команду, пытаясь несколько раз, пока она не сделает то, что она хочет.
Пользователь может запустить rm second.html
первым, если ему нужно. Это может быть хорошим компромиссом! У него есть некоторые возможные недостатки.
- Пользователь должен дважды ввести имя файла.
- Люди также получают много проблем с использованием
rm
. Поэтому я бы тоже хотел сделать его rm
более безопасным. Но как? Если мы rm
показываем каждое имя файла и просим пользователя подтвердить, теперь она должна написать три строки команд вместо одной. Кроме того, если ей придется делать это слишком часто, она приобретет привычку и наберет «у», чтобы подтвердить, не задумываясь. Так что это может быть очень раздражающим и все же опасным.
В современной системе я рекомендую установить trash
команду и использовать ее rm
там, где это возможно. Внедрение Trash Storage было отличной идеей, например, для однопользовательского графического ПК .
Я думаю, что также важно понимать ограничения оригинального оборудования Unix - ограниченное ОЗУ и дисковое пространство, вывод, отображаемый на медленных принтерах, а также на систему и программное обеспечение для разработки.
Обратите внимание, что в оригинальном Unix не было завершения табуляции , чтобы быстро заполнить имя файла для rm
команды. (Кроме того, оригинальная оболочка Bourne не имеет истории команд, например, когда вы используете клавишу со стрелкой вверх bash
).
При выводе на принтер вы бы использовали линейный редактор ed
. Это сложнее освоить, чем визуальный текстовый редактор. Вы должны напечатать некоторые текущие строки, решить, как вы хотите их изменить, и ввести команду редактирования.
Использование > second.html
немного похоже на использование команды в редакторе строк. Эффект, который он оказывает, зависит от текущего состояния. (Если он second.html
уже существует, его содержимое будет удалено). Если пользователь не уверен в текущем состоянии, он должен запускаться ls
или ls second.html
первым.
«Простая реализация» как принцип проектирования
Существует популярная интерпретация Unix-дизайна, которая начинается с:
Дизайн должен быть простым, как по реализации, так и по интерфейсу. Для реализации важнее быть простым, чем интерфейс. Простота является наиболее важным фактором в дизайне.
...
Габриэль утверждал, что «Хуже лучше» создает более успешное программное обеспечение, чем подход MIT: пока первоначальная программа в основном хороша, ее реализация займет гораздо меньше времени и усилий, и ее будет легче адаптировать к новым ситуациям. Например, перенос программного обеспечения на новые машины становится намного проще. Таким образом, его использование будет быстро распространяться задолго до того, как [лучшая] программа получит шанс для разработки и развертывания (преимущество первопроходца).
https://en.wikipedia.org/wiki/Worse_is_better