it-swarm.com.de

Gibt es irgendwelche Nachteile beim Einstellen von "Noclobber"?

Vorausgesetzt, zsh kann alle Dateien mit dem folgenden Befehl überladen:

>*

Ich denke, dass das Setzen der Option noclobber eine gute Idee wäre.

Ich kann immer >| file Verwenden, wenn ich das Standard-Clobber-Verhalten sowohl in bash als auch in zsh verwenden möchte. (zsh erlaubt auch die alternative Syntax >!file).

Ich vermute, dass noclobber aufgrund der POSIX-Kompatibilität standardmäßig nicht festgelegt ist, aber nur um sicherzugehen:

Gibt es Nachteile bei der Einstellung von noclobber?

Gibt es überhaupt eine Möglichkeit, noclobber nur für die interaktive Shell festzulegen?

22
Tom Hale

Der Grund, warum noclobber nicht standardmäßig festgelegt ist, ist Tradition. In Bezug auf das Design der Benutzeroberfläche ist es eine gute Idee, "diese neue Datei erstellen" zur einfachen Aktion zu machen und eine zusätzliche Hürde für die gefährlichere Aktion "entweder eine neue Datei erstellen oder eine vorhandene Datei überschreiben" zu setzen. Daher ist noclobber eine gute Idee (>, Um eine neue Datei zu erstellen, >|, Um möglicherweise eine vorhandene Datei zu überschreiben), und es wäre wahrscheinlich die Standardeinstellung gewesen, wenn die Shell gewesen wäre einige Jahrzehnte später entworfen.

Ich empfehle dringend, Folgendes in Ihrer interaktiven Shell-Startdatei zu verwenden (.bashrc Oder .zshrc):

set -o noclobber
alias cp='cp -i'
alias mv='mv -i'

In jedem Fall (Umleiten, Kopieren, Verschieben) besteht das Ziel darin, eine zusätzliche Hürde hinzuzufügen, wenn die Operation den Nebeneffekt haben kann, dass einige vorhandene Daten gelöscht werden, obwohl das Löschen vorhandener Daten nicht das Hauptziel der Operation ist. Ich habe rm -i Nicht in diese Liste aufgenommen, da das Löschen von Daten das Hauptziel von rm ist.

Beachten Sie, dass noclobber und -iSicherheitsnetze sind. Wenn sie auslösen, Sie haben etwas falsch gemacht. Verwenden Sie sie also nicht als Ausrede, um nicht zu überprüfen, was Sie überschreiben! Der Punkt ist, dass Sie überprüft haben sollten, dass die Ausgabedatei nicht existiert. Wenn Ihnen file exists: foo Oder overwrite 'foo'? Gesagt wird, bedeutet dies, dass Sie einen Fehler gemacht haben und sich schlecht fühlen und vorsichtiger sein sollten. Gewöhnen Sie sich insbesondere nicht an, y zu sagen, wenn Sie zum Überschreiben aufgefordert werden (die Aliase sollten wohl alias cp='yes n | cp -i' mv='yes n | mv -i' Sein, sondern drücken Ctrl+C lässt die Ausgabe besser aussehen): Wenn Sie überschreiben wollten, brechen Sie den Befehl ab, verschieben oder entfernen Sie die Ausgabedatei und führen Sie den Befehl erneut aus.

Es ist auch wichtig, sich nicht daran zu gewöhnen, diese Sicherheitsvorkehrungen auszulösen, denn wenn Sie dies tun, befinden Sie sich eines Tages auf einem Computer, auf dem Ihre Konfiguration nicht vorhanden ist, und Sie verlieren Daten, weil der Schutz, auf den Sie zählen, nicht vorhanden ist. t dort.

noclobber wird nur für interaktive Shells festgelegt, da .bashrc oder .zshrc nur von interaktiven Shells gelesen werden. Natürlich sollten Sie die Shell-Optionen nicht so ändern, dass sie sich auf Skripte auswirken, da diese Skripte beschädigt werden könnten.

Festlegen der Shell-Option noclobber in ~/.bashrc (Für bash) oder ~/.zshrc (Oder genauer $ZDOTDIR/.zshrc Für zsh) macht es in interaktiven Shell-Sitzungen aktiv.

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 sollten, ohne das Verhalten in vorhandenen Skripten zu ändern, es sei denn, Skripte beziehen diese Dateien explizit.

Der einzige Nachteil dabei ist, dass Sie immer wieder vergessen werden, dass Sie die Option zumindest am Anfang eingestellt haben. Wie bei all diesen Dingen werden Sie später anfangen, >| Gewöhnlich zu verwenden, selbst in Fällen, in denen Sie die Datei möglicherweise nicht überladen möchten (genau wie bei Personen mit Aliasnamen für rm,). cp und mv mit immer festgelegter Option -i, eventuell immer -f in der Befehlszeile verwenden).

6
Kusalananda

Der Nachteil ist, dass Sie, wenn Sie sich daran gewöhnt haben, noclobber aktiv zu haben, eines Tages ein System verwenden werden, in dem es nicht aktiv ist, und Sie werden einen potenziell gefährlichen Befehl munter ausführen, der erwartet das noclobber, um dich zu retten ... und es wird nicht. Und dann müssen Sie hoffen, dass es ein ausreichend aktuelles Backup gibt, um die von Ihnen zerstörten Daten wiederherzustellen, da Sie davon ausgegangen sind, dass Sie zuerst um Bestätigung gebeten werden.

3
Dave Sherohman