Je ne vois aucune raison pour laquelle le -p
drapeau mkdir
ne devrait pas être défini par défaut.
-p, --parents no error if existing, make parent directories as needed
C'est une commande non destructive d'après ce que je peux voir. Ai-je oublié quelque chose d'important sur la façon dont cela fonctionne?
Deuxièmement, existe-t-il un moyen simple d'obtenir ce comportement par défaut mkdir
?
command-line
Treffynnon
la source
la source
alias mkdir="mkdir -p"
.mkdp
Réponses:
Il s'agit d'une fonctionnalité facultative, qui n'est pas toujours souhaitée - en particulier dans les scripts. Envisagez les inconvénients suivants en cas de scripts:
/usr/local/lib/GreatSoftware/ImportantPartOfIt
, mais les bibliothèques dépendent de / link pour se trouver sous/usr/local/lib/GreatSoftware
. Si cela manque, le script ne doit pas continuer.Le comportement générique de la
mkdir
rend facile et naturel, car de telles situations sont signalées et peuvent être détectées immédiatement.Vous pouvez lui créer un alias si vous souhaitez toujours l'utiliser
mkdir -p
dans vos shells:(Cela devrait aller dans votre
.bashrc
configuration ou dans la configuration que votre shell utilise.)la source
alias mkdp="mkdir -p"
serait plus conseillé..bashrc
n'affectent pas (normalement) leurs environnements.alias rm='rm -i'
.rm -i
alias soit toujours mauvais - bien que cela puisse conduire à de mauvaises habitudes. Certes, tous les alias de commande ne sont pas également bons / mauvais - considérezls="ls --color=auto"
oussh="TERM=xterm ssh"
par exemple.Bien sûr, on pourrait faire valoir que la création du répertoire parent devrait être la valeur par défaut et une option de vérification pourrait être utilisée pour empêcher la création du répertoire si le parent n'existe pas.
Mais la raison pour laquelle c'est l'inverse n'est que de l'histoire. La version de base de mkdir n'a pas créé de répertoires parents. C'est pourquoi les distributions X11 sont arrivées avec une commande nommée mkdirhier qui a pu remplir cette tâche: vérifier si les répertoires parents existent et les créer si nécessaire.
Plus tard, cette fonctionnalité a été ajoutée à la commande mkdir sur de nombreuses versions UNIX (je ne sais pas si elle est dans le standard POSIX de nos jours). Pour maintenir la compatibilité de cette fonctionnalité a été mis à la disposition en activant un drapeau d'option:
-p
.Pourquoi est-il mauvais de l'avoir activé par défaut? Les scripts peuvent s'appuyer sur l' échec de mkdir si le répertoire parent n'existe pas. Surtout en tant qu'utilisateur root, il peut être dangereux de créer des arborescences de répertoires par défaut.
Exemple:
Dans cet exemple, le répertoire serait créé et la sauvegarde effectuée même si le système de fichiers
/backup
n'est pas monté et le parent/backup/$(uname -n)
n'existe pas si la valeur par défaut est l'inverse.Règle générale: il est recommandé de ne pas modifier le comportement par défaut d'un outil. Si vous le souhaitez, fournissez des options pour permettre de modifier le comportement par défaut.
la source
Je pense que c'est un peu la philosophie. La commande nue mkdir (1) (sans options) représente l' appel système mkdir (2) , fournissant ses fonctionnalités dans le shell, ne faisant ni plus ni moins.
la source
Au début , il n'y avait que la simple
mkdir
commande. Conformément aux principes de conception d'Unix, cette commande simple a effectué une tâche simple: créer un répertoire.Plus tard,
mkdir
acquis une-p
option pour gérer un cas d'utilisation courant où l'appelant veut créer zéro, un ou plusieurs répertoires pour s'assurer qu'un chemin particulier existe. Cette opération n'a pas été effectuée par défaut pour plusieurs raisons. Tout d'abord, tous les systèmes n'avaient pas cette fonctionnalité plus complexe, et nécessitant l'-p
option signifiait que les scripts qui l'utilisaient recevraient un message d'erreur raisonnable (quelque chose commemkdir: invalid option -z
) plutôt que de ne pas étrangement échouer à créer des répertoires de temps en temps. Deuxièmement, et surtout, le comportement demkdir -p
n'est pas un remplacement compatible demkdir
dans tous les cas.En particulier, sur la plupart des systèmes de fichiers,
mkdir
est une opération atomique . Si un programme s'exécutemkdir playground
et que la commande réussit, le programme sait qu'il a créé leplayground
répertoire. Cela permet au programme de traiter le nouveau répertoire comme son terrain de jeu exclusif: si une autre instance du même programme s'exécute simultanément, son appel àmkdir playground
échouera. Cette propriété n'est évidemment pas fournie parmkdir -p
car elle permet à l'argument d'exister.Si elle
mkdir -p
existait depuis le début, elle aurait pu être mise en mode par défaut, avec quelque chose commemkdir -a
pour la commande de création de répertoire unique. Mais cela n'aurait pas suivi la philosophie de conception Unix habituelle: la plupart des utilitaires de base sont de simples wrappers autour des primitives sous-jacentes, avec un comportement plus sophistiqué (comme la création de plusieurs répertoires en une seule fois) nécessitant des options fantaisistes.la source
Pour moi, le problème est que le comportement de l'option -p si elle était la valeur par défaut est essentiellement un effet secondaire. Il ajoute de la complexité à une commande en faisant quelque chose de plus que ce que vous lui avez demandé de faire. C'est encore une chose invisible à retenir. L'une des règles de base d'une bonne pratique de programmation est d'éviter les effets secondaires.
Les langages de programmation modernes sont si puissants qu'il est relativement facile de créer n'importe quelle commande complexe dont vous pourriez avoir besoin à partir des primitives fournies par un langage. Pour ce faire, il faut prendre une décision consciente sur le comportement requis et laisser un enregistrement concret et visible de ce qui a été fait.
la source