Warum heißt die Option von cp, Dateien nicht zu überschreiben, --no-clobber?

Warum heißt die Option von cp, Dateien nicht zu überschreiben, --no-clobber?

cpist ein äußerst beliebtes Linux-Tool, das vom Coreutils-Team der GNU Foundation gepflegt wird.

Standardmäßig werden Dateien mit demselben Namen überschrieben. Wenn der Benutzer dieses Verhalten ändern möchte, kann er --no-clobberseinem Kopierbefehl Folgendes hinzufügen:

   -n, --no-clobber
          do not overwrite an existing file (overrides a previous -i option)

Warum nicht so etwas wie --no-overwrite?

Antwort1

Klamotten„“ bedeutet im Zusammenhang mit Datenmanipulation die Zerstörung von Daten durch Überschreiben. Im Zusammenhang mit Dateien in einer Unix-Umgebung wurde das Wort mindestens seit den frühen 1980er Jahren verwendet, möglicherweise sogar schon früher.Cshmusste set noclobberso konfiguriert werden >, dass das Überschreiben einer bestehenden Datei abgelehnt wurde (später set -o noclobberin ksh93 und anderen sh-artigen Shells). WannGNU Coreutils hinzugefügt --no-clobber(im Jahr 2009) verwendeten sie dasselbe Vokabular wie Shells.

Antwort2

Denn das ist eigentlich ein Standardbegriff. Wie inWikipedia:

In der Softwareentwicklung bedeutet Clobbern einer Datei oder eines Computerspeichers das Überschreiben ihres Inhalts. Die Jargon File definiert Clobbern als

Zum Überschreiben, normalerweise unbeabsichtigt: „Ich bin vom Ende des Arrays weggegangen und habe den Stapel zerstört.“ Vergleichen Sie dazu „mung“, „scribble“, „trash“ und „smash the stack“.

Wie auf derselben Seite erwähnt, verwenden Bash und andere Shells den Begriff auch in ihrem set -o noclobberÄquivalent oder . Dies ist einfach der Standardbegriff für diese Art von Dingen, daher war es eine natürliche Wahl für die Entwickler von cp.

Antwort3

Der Begriff „Clobber“ ist in der Computertechnik allgemein wohlbekannt.

Die Option --no-clobber/ für wurde erst am 14.01.2009 von Kamil Dudka hinzugefügt <-ncp[email geschützt]> (Commit auf GitHub).

Insbesondere innerhalb des GNU-Projekts wird es auch in GCC verwendetum zu beschreiben, wann ein CPU-Befehl oder eine Inline-ASM-Anweisung den Inhalt eines Registers zerstört. Es handelt sich also nicht um eine zufällige englische Wortwahl, und es ist nicht unwahrscheinlich, dass Leute, die an GNU-Projekten arbeiten, die in C geschrieben sind, zumindest flüchtig mit der Verwendung des Begriffs aus GCC-Dokumenten oder von anderen GNU-Projektentwicklern vertraut sind:

  • (clobber x)InGCC-interne Maschinenbeschreibungsdateiendie GCC beibringen, was jede Anweisung in einer ISA macht. (Ähnliche Einschränkungen wie inline-asm)
  • GNU C Erweitertes AsmInline- asm()Anweisungen haben einen "Clobber"-Abschnitt, um dem Compiler mitzuteilen, auf welches Register die Inline-ASM-Vorlage zurückgreift. Wie dieses nutzlose, unsinnige x86-Beispiel:
    asm("xor %eax,%eax; mfence" ::: "eax", "memory", "cc");. zB einSO Fragen und AntwortenFragen Sie nach einer Funktionsaufrufkonvention in diesen Begriffen.
  • GCC-Dokumentefür-fcall-used-regbeschreiben Sie es so, dass es dem Compiler mitteilt, dass ein bestimmtes Register durch Funktionsaufrufe „überlastet“ ist (d. h. die Aufrufkonvention verändert wird). Im Gegensatz zu-fcall-saved-regoder-ffixed-reg.
  • GCC-WclobberedWarnung – „Warnung vor Variablen, die durch longjmp oder vfork geändert werden könnten.“ (Keine Ahnung, ob es das 2009 schon gab, aber es zeigt, dass dieses Wort in verschiedenen Kontexten zur Beschreibung dieser Art von Dingen verwendet wird, einschließlich Optionsnamen in anderen Programmen).

Der Autor des Coreutils-Commits, der hinzugefügt hat --no-clobber, Kamil Dudka, ist definitiv mit den internen Vorgängen bei GCC vertraut: Er (später?)habe ein GCC-Plugin geschriebenzur formalen Verifikation von C-Programmen.

Ich weiß nicht, ob seine Namenswahl von internen Vorgängen bei GCC beeinflusst wurde, oder ob diese von vorhandenen Shell-Optionen wie herrührten set noclobber, oder von beidem.

Interessante Tatsache: Zu den ursprünglichen Autoren von GNU cpgehört Torjorn Granlund, Hauptautor vondas gmplib-Projekt(GNU Multi-Precision) und der bei der Erfindung/Implementierung der multiplikativ-inversen Optimierung von GCC für die Division durch eine Konstante zur Kompilierungszeit (Artikel von 1994, PaketüberflussFragen und Antworten).

verwandte Informationen