È "fare una cosa alla volta"?
Questo commento sembra una domanda su un principio generale di progettazione. Spesso, le domande su questi sono molto soggettive e non siamo in grado di scrivere una risposta adeguata. Tieni presente che in questo caso potremmo chiudere le domande.
A volte abbiamo una spiegazione per la scelta del design originale, perché gli sviluppatori hanno scritto su di loro. Ma non ho una risposta così bella per questa domanda.
Perché cp
è progettato in questo modo?
Il problema è che Unix ha più di 40 anni.
Se stavi creando un nuovo sistema ora, potresti fare diverse scelte progettuali. Ma cambiare Unix romperebbe gli script esistenti, come menzionato in altre risposte.
Perché è stato cp
progettato per sovrascrivere silenziosamente i file esistenti?
La risposta breve è "Non lo so" :-).
Comprendi che cp
è solo un problema. Penso che nessuno dei programmi di comando originali sia protetto dalla sovrascrittura o dall'eliminazione dei file. La shell ha un problema simile quando reindirizza l'output:
$ cat first.html > second.html
Questo comando inoltre sovrascrive silenziosamente second.html
.
Sono interessato a pensare a come riprogettare tutti questi programmi. Potrebbe richiedere ulteriore complessità.
Penso che questo sia parte della spiegazione: i primi Unix enfatizzavano semplici implementazioni . Per una spiegazione più dettagliata di ciò, vedi "peggio è meglio", collegato alla fine di questa risposta.
È possibile modificare in > second.html
modo che si interrompa con un errore, se second.html
esiste già. Tuttavia, come abbiamo accennato, a volte l'utente non vuole sostituire un file esistente. Ad esempio, potrebbe creare un comando complesso, provando più volte finché non fa quello che vuole.
L'utente potrebbe eseguire rm second.html
prima se necessario. Questo potrebbe essere un buon compromesso! Ha alcuni possibili svantaggi.
- L'utente deve digitare il nome file due volte.
- Le persone hanno anche molti problemi con l'uso
rm
. Quindi vorrei rendere anche rm
più sicuro. Ma come? Se facciamo rm
mostrare ogni nome di file e chiediamo all'utente di confermare, ora deve scrivere tre righe di comandi anziché uno. Inoltre, se deve farlo troppo spesso, prenderà l'abitudine e digiterà "y" per confermare senza pensare. Quindi potrebbe essere molto fastidioso e potrebbe essere ancora pericoloso.
Su un sistema moderno, consiglio di installare il trash
comando e di usarlo al posto del rm
possibile. L'introduzione della memoria Cestino è stata una grande idea, ad esempio per un PC grafico a utente singolo .
Penso che sia anche importante comprendere i limiti dell'hardware Unix originale: spazio RAM e disco limitato, output visualizzato su stampanti lente , nonché sistema e software di sviluppo.
Si noti che Unix originale non aveva il completamento della scheda , per riempire rapidamente un nome file per un rm
comando. (Inoltre, la shell Bourne originale non ha una cronologia dei comandi, ad esempio quando si utilizza il tasto freccia Su bash
).
Con l'uscita della stampante, è necessario utilizzare line-based, ed
. Questo è più difficile da imparare rispetto a un editor di testo visivo. Devi stampare alcune linee correnti, decidere come modificarle e digitare un comando di modifica.
Usare > second.html
è un po 'come usare un comando in un editor di linee. L'effetto che ha dipende dallo stato corrente. (Se second.html
esiste già, il suo contenuto verrà scartato). Se l'utente non è sicuro dello stato corrente, dovrebbe essere eseguita ls
o ls second.html
prima.
"Implementazione semplice" come principio progettuale
C'è un'interpretazione popolare del design Unix, che inizia:
Il design deve essere semplice, sia nella realizzazione che nell'interfaccia. È più importante che l'implementazione sia semplice dell'interfaccia. La semplicità è la considerazione più importante in un design.
...
Gabriel ha sostenuto che "Peggio è meglio" ha prodotto un software di maggior successo rispetto all'approccio del MIT: fintanto che il programma iniziale è sostanzialmente buono, ci vorranno molto meno tempo e sforzi per implementarlo inizialmente e sarà più facile adattarsi a nuove situazioni. Il porting del software su nuove macchine, ad esempio, diventa molto più semplice in questo modo. Pertanto il suo utilizzo si diffonderà rapidamente, molto prima che un programma [migliore] abbia la possibilità di essere sviluppato e distribuito (vantaggio della prima mossa).
https://en.wikipedia.org/wiki/Worse_is_better