Da zsh
alle Dateien den Befehl gegeben verprügeln können:
>*
Ich denke, dass das Setzen der Option noclobber
eine gute Idee wäre.
Ich kann immer verwenden, >| file
wenn ich das Standard-Clobber-Verhalten sowohl in bash als auch in zsh verwenden möchte. (zsh erlaubt auch die alternative Syntax >!file
).
Ich noclobber
vermute, dass aufgrund der POSIX-Kompatibilität standardmäßig nicht festgelegt ist, aber nur um sicherzugehen:
Gibt es Nachteile beim Einstellen noclobber
?
Gibt es sowieso noclobber
nur für die interaktive Shell zu setzen?
rm *
...Antworten:
Der Grund, der
noclobber
nicht standardmäßig festgelegt ist, ist Tradition. In Bezug auf das Design der Benutzeroberfläche ist es eine gute Idee, die Aktion "Diese neue Datei erstellen" zu vereinfachen und die gefährlichere Aktion "Eine neue Datei erstellen oder eine vorhandene Datei überschreiben" als zusätzliche Hürde zu definieren. Dahernoclobber
ist es eine gute Idee (>
eine neue Datei zu erstellen,>|
möglicherweise eine vorhandene Datei zu überschreiben), und es wäre wahrscheinlich die Standardeinstellung gewesen, wenn die Shell einige Jahrzehnte später entworfen worden wäre.Ich empfehle dringend, Folgendes in Ihrer interaktiven Shell-Startdatei (
.bashrc
oder.zshrc
) zu verwenden:In jedem Fall (Umleiten, Kopieren, Verschieben) besteht das Ziel darin, eine zusätzliche Hürde hinzuzufügen, wenn die Operation den Nebeneffekt hat, dass einige vorhandene Daten gelöscht werden, obwohl das Löschen vorhandener Daten nicht das primäre Ziel der Operation ist. Ich schreibe nicht
rm -i
in diese Liste, weil das Löschen von Daten das Hauptziel von istrm
.Beachten Sie das
noclobber
und-i
sind Sicherheitsnetze . Wenn sie auslösen, haben Sie etwas falsch gemacht . Verwenden Sie sie also nicht als Entschuldigung, um nicht zu überprüfen, was Sie überschreiben! Der Punkt ist, dass Sie überprüft haben sollten, dass die Ausgabedatei nicht existiert. Wenn Ihnenfile exists: foo
oder gesagt wirdoverwrite 'foo'?
, bedeutet dies, dass Sie einen Fehler gemacht haben und dass Sie sich schlecht fühlen und vorsichtiger sein sollten. Machen Sie sich insbesondere nicht die Gewohnheit, zu sagen,y
wenn Sie zum Überschreiben aufgefordert werden (wahrscheinlich sollten es die Aliase seinalias cp='yes n | cp -i' mv='yes n | mv -i'
, aber wenn Sie Ctrl+ drücken, Csieht die Ausgabe besser aus): Wenn Sie überschreiben wollten, brechen Sie den Befehl ab, verschieben oder entfernen Sie die Ausgabe Datei, und führen Sie den Befehl erneut aus.Es ist auch wichtig, dass Sie sich nicht angewöhnen, diese Sicherheitsmaßnahmen auszulösen, da Sie sich eines Tages auf einem Computer befinden, der nicht über Ihre Konfiguration verfügt, und Sie Daten verlieren, weil der Schutz, auf den Sie zählen, nicht vorhanden ist. t dort.
noclobber
wird nur für interaktiven Shells gesetzt werden, da.bashrc
oder.zshrc
nur durch interaktiven Shells gelesen wird. Natürlich sollten Sie die Shell-Optionen nicht so ändern, dass sie sich auf Skripte auswirken, da sie diese Skripte beschädigen könnten.quelle
rm
Es gibt eine Option-I
, die ich verwende und empfehle: "Vor dem Entfernen von mehr als drei Dateien einmal auffordern oder beim rekursiven Entfernen; weniger aufdringlich als-i
beim Schutz vor den meisten Fehlern"-i
ihnen als Standardargument ist eine ausgezeichnete Idee, aber es sollte angewendet werden verschiedene Alias - Namen , nicht die Originale (zB Ich habe immeralias copy="cp -i"
undalias move="mv -i"
in meinem .bashrc). Warum? Wegen Fehlermodus. Was passiert, wenn Sie einen Computer oder einen anderen Benutzer verwenden, der nicht über die cp / mv-Aliase verfügt? Dateien möglicherweise unbeabsichtigt überschrieben (möglicherweise unentdeckt!). Entsprechender Fehlermodus mit Alias kopieren / verschieben: Shell beklagt, dass der Befehl nicht erkannt wird.-i
Argument für cp und mv zu verwenden, ist ausgezeichnet, aber der Rat, die Namen cp und mv wiederzuverwenden, ist fürchterlich schlecht. Es ist so schlimm, dass ich die Antwort ablehnen muss. Bitte ändern Sie, um andere Aliasnamen zu verwenden, und ich gebe ihr eine Gegenstimme.alias RM='command rm'
, wodurch zsh angewiesen wird , den externen Befehlrm
anstelle des Alias zu verwenden. Auf diese Weise müssen Sie sich nicht auf das--interactive=never
Ersetzen eines vorherigen verlassen-i
.Wenn Sie die
noclobber
Shell-Option in~/.bashrc
(fürbash
) oder~/.zshrc
(genauer gesagt$ZDOTDIR/.zshrc
inzsh
) festlegen, wird sie in interaktiven Shell-Sitzungen aktiviert.Nicht interaktive Shells (Skripte) lesen diese Dateien nicht.
Shell-Optionen werden normalerweise nicht von übergeordneten Shells geerbt.
Dies bedeutet, dass Sie die Option in diesen Dateien festlegen können, ohne das Verhalten in vorhandenen Skripten zu ändern, es sei denn, Skripten geben diese Dateien explizit als Quelle an.
Der einzige Nachteil dabei ist, dass Sie, zumindest zu Beginn, immer wieder vergessen werden, dass Sie die Option aktiviert haben. Später, als all diese Art von Dingen, werden Sie zu ihrem gewöhnlichen Gebrauch beginnen
>|
, auch in Fällen , in denen Sie tatsächlich nicht um die Datei verprügeln möchten (wie Menschen mit Aliasnamen fürrm
,cp
undmv
mit der-i
Option immer dann gesetzt, was schließlich zu immer Gebrauch beginnen-f
auf der Kommandozeile).quelle
bash
werden Optionen vererbt, wenn sich$SHELLOPTS
($BASHOPTS
fürshopt
diejenigen) in der Umgebung befindet (was Sie jedoch aus diesem Grund normalerweise nicht tun möchten).Der Nachteil ist, dass
noclobber
Sie eines Tages ein System verwenden werden, auf dem es nicht aktiv ist, und einen potenziell gefährlichen Befehl ausführen, dernoclobber
Sie retten wird. Und dann müssen Sie hoffen, dass es ein aktuelles Backup gibt, mit dem Sie die zerstörten Daten wiederherstellen können, da Sie davon ausgegangen sind, dass Sie zuerst um Bestätigung gebeten werden.quelle