La raison noclobber
n'est pas définie par défaut est la tradition. En ce qui concerne la conception de l'interface utilisateur, c'est une bonne idée de faire de "créer ce nouveau fichier" l'action facile et de mettre un obstacle supplémentaire l'action la plus dangereuse "soit créer un nouveau fichier ou écraser un fichier existant". C'est donc noclobber
une bonne idée ( >
pour créer un nouveau fichier, >|
pour écraser potentiellement un fichier existant) et ce serait probablement la valeur par défaut si le shell avait été conçu quelques décennies plus tard.
Je recommande fortement d'utiliser ce qui suit dans votre fichier de démarrage du shell interactif ( .bashrc
ou .zshrc
):
set -o noclobber
alias cp='cp -i'
alias mv='mv -i'
Dans chaque cas (redirection, copie, déplacement), l'objectif est d'ajouter un obstacle supplémentaire lorsque l'opération peut avoir pour effet secondaire d'effacer certaines données existantes, même si l'effacement des données existantes n'est pas l'objectif principal de l'opération. Je ne mets pas rm -i
dans cette liste car l'effacement des données est l'objectif principal de rm
.
Notez cela noclobber
et ce -i
sont des filets de sécurité . S'ils se déclenchent, vous avez fait quelque chose de mal . Ne les utilisez donc pas comme excuse pour ne pas vérifier ce que vous écrasez! Le fait est que vous devriez avoir vérifié que le fichier de sortie n'existe pas. Si on vous dit file exists: foo
ou overwrite 'foo'?
, cela signifie que vous avez fait une erreur et que vous devriez vous sentir mal et être plus prudent. En particulier, ne prenez pas l'habitude de dire y
si vous êtes invité à écraser (sans doute, les alias devraient l'être alias cp='yes n | cp -i' mv='yes n | mv -i'
, mais en appuyant sur Ctrl+, Cla sortie est meilleure): si vous vouliez écraser, annuler la commande, déplacer ou supprimer la sortie fichier et réexécutez la commande.
Il est également important de ne pas prendre l'habitude de déclencher ces sécurités car si vous le faites, vous serez un jour sur une machine qui n'a pas votre configuration, et vous perdrez des données car les protections sur lesquelles vous comptiez ne sont pas '' t là.
noclobber
ne sera défini que pour les shells interactifs, car .bashrc
ou .zshrc
n'est lu que par les shells interactifs. Bien sûr, vous ne devez pas modifier les options du shell d'une manière qui affecterait les scripts, car cela pourrait casser ces scripts.
rm *
...