¿Es "hacer una cosa a la vez"?
Este comentario suena como una pregunta sobre un principio de diseño general. A menudo, las preguntas sobre estos son muy subjetivas, y no podemos escribir una respuesta adecuada. Tenga en cuenta que podemos cerrar preguntas en este caso.
A veces tenemos una explicación para la elección del diseño original, porque los desarrolladores han escrito sobre ellas. Pero no tengo una buena respuesta para esta pregunta.
¿Por qué cp
está diseñado de esta manera?
El problema es que Unix tiene más de 40 años.
Si estuviera creando un nuevo sistema ahora, podría hacer diferentes elecciones de diseño. Pero cambiar Unix rompería los scripts existentes, como se menciona en otras respuestas.
¿Por qué se cp
diseñó para sobrescribir silenciosamente los archivos existentes?
La respuesta corta es "No sé" :-).
Comprende que ese cp
es solo un problema. Creo que ninguno de los programas de comando originales está protegido contra la sobrescritura o eliminación de archivos. El shell tiene un problema similar al redirigir la salida:
$ cat first.html > second.html
Este comando también sobrescribe en silencio second.html
.
Me interesa pensar cómo se podrían rediseñar todos estos programas. Puede requerir cierta complejidad adicional.
Creo que esto es parte de la explicación: los primeros Unix enfatizaron implementaciones simples . Para una explicación más detallada de esto, vea "peor es mejor", vinculado al final de esta respuesta.
Puede cambiar > second.html
para que se detenga con un error, si second.html
ya existe. Sin embargo, como hemos mencionado, a veces el usuario no desea reemplazar un archivo existente. Por ejemplo, puede estar construyendo un comando complejo, intentando varias veces hasta que haga lo que quiere.
El usuario podría correr rm second.html
primero si lo necesita. ¡Esto podría ser un buen compromiso! Tiene algunas posibles desventajas propias.
- El usuario debe escribir el nombre de archivo dos veces.
- Las personas también tienen muchos problemas para usar
rm
. Así que me gustaría hacer rm
más seguro también. ¿Pero cómo? Si hacemos rm
mostrar cada nombre de archivo y le pedimos al usuario que confirme, ahora tiene que escribir tres líneas de comandos en lugar de una. Además, si tiene que hacer esto con demasiada frecuencia, se acostumbrará y escribirá "y" para confirmar sin pensar. Por lo tanto, podría ser muy molesto y aún podría ser peligroso.
En un sistema moderno, recomiendo instalar el trash
comando y usarlo en lugar de rm
donde sea posible. La introducción del almacenamiento de basura fue una gran idea, por ejemplo, para una PC gráfica de usuario único .
Creo que también es importante comprender las limitaciones del hardware original de Unix: RAM y espacio en disco limitados, salida mostrada en impresoras lentas , así como el sistema y el software de desarrollo.
Observe que el Unix original no tenía finalización de tabulación , para completar rápidamente un nombre de archivo para un rm
comando. (Además, el shell Bourne original no tiene historial de comandos, por ejemplo, como cuando usa la tecla de flecha hacia arriba bash
).
Con la salida de impresora, se usaría editor basado en línea, ed
. Esto es más difícil de aprender que un editor de texto visual. Debe imprimir algunas líneas actuales, decidir cómo desea cambiarlas y escribir un comando de edición.
Usar > second.html
es un poco como usar un comando en un editor de línea. El efecto que tiene depende del estado actual. (Si second.html
ya existe, su contenido será descartado). Si el usuario no está seguro del estado actual, se espera que se ejecute ls
o que ls second.html
primero.
"Implementación simple" como principio de diseño
Hay una interpretación popular del diseño de Unix, que comienza:
El diseño debe ser simple, tanto en la implementación como en la interfaz. Es más importante que la implementación sea simple que la interfaz. La simplicidad es la consideración más importante en un diseño.
...
Gabriel argumentó que "Peor es mejor" produjo un software más exitoso que el enfoque MIT: siempre que el programa inicial sea básicamente bueno, llevará mucho menos tiempo y esfuerzo implementarlo inicialmente y será más fácil adaptarse a nuevas situaciones. Portar software a nuevas máquinas, por ejemplo, se vuelve mucho más fácil de esta manera. Por lo tanto, su uso se extenderá rápidamente, mucho antes de que un [mejor] programa tenga la oportunidad de desarrollarse y desplegarse (ventaja de primer jugador).
https://en.wikipedia.org/wiki/Worse_is_better