Ich sehe keinen Grund, warum das -p
Flag mkdir
nicht standardmäßig gesetzt sein sollte.
-p, --parents no error if existing, make parent directories as needed
Es ist ein zerstörungsfreier Befehl, soweit ich sehen kann. Habe ich etwas Wichtiges an der Funktionsweise verpasst?
Zweitens gibt es eine einfache Möglichkeit, dies zum Standardverhalten von zu machen mkdir
?
command-line
Treffynnon
quelle
quelle
alias mkdir="mkdir -p"
.mkdp
Antworten:
Dies ist eine optionale Funktion, die nicht immer erwünscht ist - insbesondere in Skripten. Beachten Sie bei Skripten die folgenden Nachteile:
/usr/local/lib/GreatSoftware/ImportantPartOfIt
, aber die Bibliotheken hängen von / link to stuff unter ab/usr/local/lib/GreatSoftware
. Wenn dies fehlt, sollte das Skript nicht fortgesetzt werden.Das generische Verhalten von
mkdir
macht es einfach und natürlich, da solche Situationen gemeldet werden und sofort erfasst werden können.Sie können einen Alias dafür erstellen, wenn Sie ihn immer
mkdir -p
in Ihren Shells verwenden möchten :(Dies sollte zu Ihrer
.bashrc
oder einer anderen Konfiguration gehen, die Ihre Shell verwendet.)quelle
alias mkdp="mkdir -p"
wäre ratsamer, einen neuen Alias oder eine neue Funktion zu erstellen..bashrc
wirken sich (normalerweise) nicht auf ihre Umgebung aus.alias rm='rm -i'
.rm -i
Alias immer schlecht ist - obwohl dies zu schlechten Gewohnheiten führen könnte. Sicherlich sind nicht alle Befehls-Aliase gleich gut / schlecht - überlegen Siels="ls --color=auto"
oderssh="TERM=xterm ssh"
zum Beispiel.Natürlich könnte man argumentieren, dass die Erstellung eines übergeordneten Verzeichnisses die Standardeinstellung sein sollte, und eine Prüfoption könnte verwendet werden, um die Erstellung eines Verzeichnisses zu verhindern, wenn das übergeordnete Verzeichnis nicht vorhanden ist.
Aber der Grund, warum es umgekehrt ist, ist nur Geschichte. Die Basisversion von mkdir hat keine übergeordneten Verzeichnisse erstellt. Aus diesem Grund wurden die X11-Distributionen mit einem Befehl namens mkdirhier geliefert, der diese Aufgabe erfüllen konnte: Überprüfen Sie, ob die übergeordneten Verzeichnisse vorhanden sind, und erstellen Sie sie, falls erforderlich.
Später wurde diese Funktionalität in vielen UNIX-Versionen zum Befehl mkdir hinzugefügt (ich weiß nicht, ob sie heutzutage im POSIX-Standard enthalten ist). Um die Kompatibilität aufrechtzuerhalten, wurde diese Funktion durch Aktivieren eines Optionsflags verfügbar gemacht :
-p
.Warum ist es schlecht, wenn es standardmäßig aktiviert ist? Skripte können davon abhängen, dass mkdir fehlschlägt, wenn das übergeordnete Verzeichnis nicht vorhanden ist. Insbesondere als Benutzer root kann es gefährlich sein, standardmäßig Verzeichnisbäume zu erstellen.
Beispiel:
In diesem Beispiel wird das Verzeichnis erstellt und die Sicherung auch dann durchgeführt, wenn das Dateisystem
/backup
nicht bereitgestellt ist und das übergeordnete Verzeichnis/backup/$(uname -n)
nicht vorhanden ist, wenn die Standardeinstellung umgekehrt wäre.Faustregel: Es wird empfohlen, das Standardverhalten eines Werkzeugs nicht zu ändern. Geben Sie bei Bedarf Optionen an, mit denen Sie das Standardverhalten ändern können.
quelle
Ich denke, das ist eine Art Philosophie. Der Befehl bare mkdir (1) (ohne Optionen) stellt den Systemaufruf mkdir (2) dar und stellt seine Funktionalität in der Shell bereit , ohne mehr oder weniger zu tun.
quelle
Am Anfang gab es nur den bloßen
mkdir
Befehl. In Übereinstimmung mit den Entwurfsprinzipien von Unix führte dieser einfache Befehl eine einfache Aufgabe aus: das Erstellen eines Verzeichnisses.Später wurde
mkdir
eine-p
Option erworben, um einen allgemeinen Anwendungsfall zu behandeln, bei dem der Aufrufer null, ein oder mehrere Verzeichnisse erstellen möchte, um sicherzustellen, dass ein bestimmter Pfad vorhanden ist. Dies wurde aus mehreren Gründen nicht zur Standardoperation gemacht. Erstens hatten nicht alle Systeme diese komplexere Funktion, und das Erfordernis der-p
Option bedeutete, dass Skripte, die sie verwendeten, eine vernünftige Fehlermeldung (so etwas wiemkdir: invalid option -z
) erhielten, anstatt seltsamerweise gelegentlich keine Verzeichnisse zu erstellen. Zweitens und vor allem ist das Verhalten vonmkdir -p
nichtmkdir
in allen Fällen ein kompatibler Ersatz .Insbesondere ist bei den meisten Dateisystemen
mkdir
eine atomare Operation . Wenn ein Programm ausgeführt wirdmkdir playground
und der Befehl erfolgreich ist, weiß das Programm, dass es dasplayground
Verzeichnis erstellt hat. Auf diese Weise kann das Programm das neue Verzeichnis als exklusiven Spielplatz behandeln: Wenn eine andere Instanz desselben Programms gleichzeitig ausgeführt wird, schlägt der Aufruf vonmkdir playground
fehl. Diese Eigenschaft wird offensichtlich nicht von bereitgestellt,mkdir -p
da das Argument vorhanden sein kann.Wenn
mkdir -p
es von Anfang an existiert hätte, hätte es zum Standardmodus gemacht werden können, etwamkdir -a
für den Befehl zum Erstellen eines einzelnen Verzeichnisses. Dies wäre jedoch nicht der üblichen Unix-Designphilosophie gefolgt: Die meisten grundlegenden Dienstprogramme sind einfache Wrapper um die zugrunde liegenden Grundelemente, wobei ein ausgefalleneres Verhalten (wie das Erstellen mehrerer Verzeichnisse auf einmal) ausgefallene Optionen erfordert.quelle
Für mich ist das Problem, dass das Verhalten der Option -p, wenn es die Standardeinstellung wäre, im Wesentlichen ein Nebeneffekt ist. Es erhöht die Komplexität eines Befehls, indem es etwas zusätzlich zu dem tut, was Sie von ihm verlangt haben. Es ist eine weitere unsichtbare Sache, an die man sich erinnern muss. Eine der Grundregeln der Soundprogrammierungspraxis besteht darin, Nebenwirkungen zu vermeiden.
Moderne Programmiersprachen sind so leistungsfähig, dass es relativ einfach ist, aus den Grundelementen einer Sprache einen komplexen Befehl zu erstellen, den Sie möglicherweise benötigen. Dies beinhaltet eine bewusste Entscheidung darüber, welches Verhalten erforderlich ist, und hinterlässt eine konkrete, sichtbare Aufzeichnung dessen, was getan wurde.
quelle