Il motivo noclobbernon è impostato di default è tradizione. Per quanto riguarda la progettazione dell'interfaccia utente, è una buona idea rendere "crea questo nuovo file" l'azione semplice e mettere un ulteriore ostacolo all'azione più pericolosa "o creare un nuovo file o sovrascrivere un file esistente". Quindi noclobberè una buona idea ( >creare un nuovo file, >|sovrascrivere potenzialmente un file esistente) e sarebbe probabilmente stato il default se la shell fosse stata progettata qualche decennio dopo.
Consiglio vivamente di utilizzare quanto segue nel file di avvio della shell interattivo ( .bashrco .zshrc):
set -o noclobber
alias cp='cp -i'
alias mv='mv -i'
In ogni caso (reindirizzamento, copia, spostamento), l'obiettivo è quello di aggiungere un ulteriore ostacolo quando l'operazione potrebbe avere l'effetto collaterale di cancellare alcuni dati esistenti, anche se la cancellazione di dati esistenti non è l'obiettivo principale dell'operazione. Non inserisco rm -iquesto elenco perché la cancellazione dei dati è l'obiettivo principale di rm.
Fare nota che noclobbere -isono reti di sicurezza . Se si innescano, hai fatto qualcosa di sbagliato . Quindi non usarli come scusa per non controllare ciò che stai sovrascrivendo! Il punto è che avresti dovuto verificare che il file di output non esistesse. Se ti viene detto file exists: fooo overwrite 'foo'?, significa che hai fatto un errore e dovresti sentirti male ed essere più attento. In particolare, non prendere l'abitudine di dire yse ti viene richiesto di sovrascrivere (probabilmente, gli alias dovrebbero essere alias cp='yes n | cp -i' mv='yes n | mv -i', ma premendo Ctrl+ Crende l'output migliore): se intendevi sovrascrivere, annullare il comando, spostare o rimuovere l'output file ed eseguire nuovamente il comando.
È anche importante non prendere l'abitudine di innescare quelle sicurezze perché se lo fai, un giorno sarai su una macchina che non ha la tua configurazione e perderai i dati perché le protezioni su cui contavi non sono lì.
noclobberverrà impostato solo per shell interattive, poiché .bashrco .zshrcviene letto solo da shell interattive. Ovviamente non dovresti cambiare le opzioni della shell in un modo che possa influenzare gli script, dal momento che potrebbe spezzarli.
rm *