Gibt es irgendwelche Nachteile bei der Einstellung von "noclobber"?

19

Da zshalle Dateien den Befehl gegeben verprügeln können:

>*

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

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

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

Gibt es Nachteile beim Einstellen noclobber?

Gibt es sowieso noclobbernur für die interaktive Shell zu setzen?

Tom Hale
quelle
3
Ich bin überrascht, dass zsh zumindest nicht davor warnt, da es vor so etwas wie rm *...
warnt

Antworten:

23

Der Grund, der noclobbernicht 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. Daher noclobberist 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 ( .bashrcoder .zshrc) zu verwenden:

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 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 -iin diese Liste, weil das Löschen von Daten das Hauptziel von ist rm.

Beachten Sie das noclobberund -isind 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 Ihnen file exists: foooder gesagt wird overwrite '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, ywenn Sie zum Überschreiben aufgefordert werden (wahrscheinlich sollten es die Aliase sein alias 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.

noclobberwird nur für interaktiven Shells gesetzt werden, da .bashrcoder .zshrcnur 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.

Gilles 'SO - hör auf böse zu sein'
quelle
6
rmEs 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 -ibeim Schutz vor den meisten Fehlern"
Reid,
8
Ich empfehle nicht cp wieder Aliasing und auf diese Weise mv. Doch mit -iihnen als Standardargument ist eine ausgezeichnete Idee, aber es sollte angewendet werden verschiedene Alias - Namen , nicht die Originale (zB Ich habe immer alias copy="cp -i"und alias 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.
Hlovdal
1
Es gibt auch einen zusätzlichen Fehlermodus für cp / mv-Alias: Wenn Sie ein Shell-Skript schreiben, kann jemand, der für cp = "cp -i" -Alias ​​verwendet wird, einen cp-Befehl schreiben, der fälschlicherweise erwartet, dass er sich wie in einem interaktiven Modus verhält, da es keinen gibt Namensunterschied. Im Gegensatz dazu weiß ich jedes Mal, wenn ich "copy somefile / some / where" schreibe, dass ich einen Alias ​​und nicht den Befehl cp direkt verwende. Und selbst wenn ich eine Kopie in eine Shell-Datei einfügen würde, würde dies genauso fehlschlagen wie bei einer Shell mit fehlendem Alias.
Lovdal
1
Also, TL; DR, der Rat, standardmäßig das -iArgument 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.
Lovdal
1
@TomHale Sie könnten verwenden alias RM='command rm', wodurch zsh angewiesen wird , den externen Befehl rmanstelle des Alias ​​zu verwenden. Auf diese Weise müssen Sie sich nicht auf das --interactive=neverErsetzen eines vorherigen verlassen -i.
Adaephon
6

Wenn Sie die noclobberShell-Option in ~/.bashrc(für bash) oder ~/.zshrc(genauer gesagt $ZDOTDIR/.zshrcin zsh) 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ür rm, cpund mvmit der -iOption immer dann gesetzt, was schließlich zu immer Gebrauch beginnen -fauf der Kommandozeile).

Kusalananda
quelle
2
Mit bashwerden Optionen vererbt, wenn sich $SHELLOPTS( $BASHOPTSfür shoptdiejenigen) in der Umgebung befindet (was Sie jedoch aus diesem Grund normalerweise nicht tun möchten).
Stéphane Chazelas
3

Der Nachteil ist, dass noclobberSie eines Tages ein System verwenden werden, auf dem es nicht aktiv ist, und einen potenziell gefährlichen Befehl ausführen, der noclobberSie 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.

Dave Sherohman
quelle
Sicher, eines Tages werden Sie ein System verwenden, auf dem es nicht aktiv ist. Wenn Sie ein unbekanntes System verwenden, sollten Sie besonders vorsichtig sein und sicherstellen, dass die Sicherungen auf dem neuesten Stand sind, bevor Sie potenziell zerstörerische Maßnahmen wie die Umleitung der Ausgabe in eine Datei ergreifen.
Gilles 'SO- hör auf böse zu sein'