Il motivo noclobber
non è 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 ( .bashrc
o .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 -i
questo elenco perché la cancellazione dei dati è l'obiettivo principale di rm
.
Fare nota che noclobber
e -i
sono 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: foo
o overwrite 'foo'?
, significa che hai fatto un errore e dovresti sentirti male ed essere più attento. In particolare, non prendere l'abitudine di dire y
se 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ì.
noclobber
verrà impostato solo per shell interattive, poiché .bashrc
o .zshrc
viene 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 *