web-dev-qa-db-fra.com

Y a-t-il des inconvénients à définir «noclobber»?

Étant donné que zsh peut encombrer tous les fichiers avec la commande:

>*

Je pense que la définition de l'option noclobber serait une bonne idée.

Je peux toujours utiliser >| file si je veux utiliser le comportement de clobber par défaut dans bash et zsh. (zsh autorise également la syntaxe alternative >!file).

Je suppose que noclobber n'est pas défini par défaut en raison de la compatibilité POSIX, mais juste pour être sûr:

Y a-t-il des inconvénients à définir noclobber?

Existe-t-il de toute façon de définir noclobber uniquement pour le shell interactif?

22
Tom Hale

La raison pour laquelle 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". noclobber est donc 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 interactif Shell (.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 que noclobber et -i sont 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é à remplacer (sans doute, les alias devraient être alias cp='yes n | cp -i' mv='yes n | mv -i', mais en appuyant sur Ctrl+C rend la sortie plus belle): si vous vouliez écraser, annulez la commande, déplacez ou supprimez le fichier de sortie et exécutez à nouveau 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 des shells interactifs. Bien sûr, vous ne devez pas modifier les options Shell d'une manière qui affecterait les scripts, car cela pourrait casser ces scripts.

Définition de l’option noclobber Shell dans ~/.bashrc (pour bash) ou ~/.zshrc (ou plus précisément $ZDOTDIR/.zshrc, pour zsh) le rendra actif dans les sessions interactives Shell.

Les shells (scripts) non interactifs ne lisent pas ces fichiers.

Les options de shell ne sont généralement pas héritées des shells parents.

Cela signifie que vous devriez pouvoir définir l'option dans ces fichiers sans modifier le comportement des scripts existants, à moins que les scripts ne sources explicitement ces fichiers.

Le seul inconvénient de ce que je vois est que vous oublierez à plusieurs reprises que vous avez défini l'option, au moins au début. Plus tard, comme pour tout ce genre de choses, vous commencerez à utiliser habituellement >|, même dans les cas où vous ne voudrez peut-être pas réellement encombrer le fichier (tout comme les personnes avec des alias pour rm, cp et mv avec le -i option toujours définie, éventuellement commencer à toujours utiliser -f sur la ligne de commande).

6
Kusalananda

L'inconvénient est que, si vous vous habituez à avoir noclobber actif, vous utiliserez un jour un système où il pas actif et vous exécuterez allègrement une commande potentiellement dangereuse, en attendant le noclobber pour vous sauver ... et ce ne sera pas le cas. Et puis vous devrez espérer qu'il existe une sauvegarde assez récente pour récupérer les données que vous avez détruites car vous supposiez que l'on vous demanderait d'abord une confirmation.

3
Dave Sherohman