Warum install anstelle von cp und mkdir verwenden?

67

Ich habe an vielen Stellen gesehen, install -dwie man Verzeichnisse erstellt und install -ceine Datei kopiert. Warum nicht mkdirund verwenden cp? Gibt es einen Vorteil bei der Verwendung install?

Neaţu Ovidiu Gabriel
quelle

Antworten:

58

Es hängt davon ab, was Sie tun.

Der installBefehl wird normalerweise in Installationsskripten verwendet, die mit Paketen und Quellcode zum Installieren einer Binärdatei auf Ihrem System geliefert werden. Es kann auch verwendet werden, um andere Dateien oder Verzeichnisse zu installieren. Zusätzlich zu den Optionen -dund -chaben Sie die Möglichkeit -m, die neuen Berechtigungen der zu installierenden Datei anzugeben, damit Sie nicht die Schritte a cpund a chmodausführen müssen, um das gleiche Ergebnis zu erzielen. Zum Beispiel:

install -m644 "$srcdir/$pkgname-$pkgver-linux64" "$pkgdir/opt/$pkgname"

Sie haben auch Optionen -gund -ozum Festlegen der Zielgruppe bzw. des Eigentümers. Dies vermeidet separate Anrufe an chown. Im Allgemeinen installverkürzt die Verwendung Ihres Skripts die Länge und macht es übersichtlicher, indem Sie die Erstellung, das Kopieren, die Einstellung des Modus und verwandte Dinge in einem Befehl statt in vielen Befehlen ausführen.

Referenz siehe man install. Schauen Sie sich zur Verwendung einfach ein Installationsskript an, das mit einem Paketquellcode geliefert wurde .


quelle
22

"install" kombiniert im Allgemeinen die folgenden Aktionen:

  • Kopieren der angegebenen Datei an den Zielort, was in Bezug auf Prozesse durchgeführt wird, die eine alte Kopie verwenden. Anders als bei "cp" wird bei "install" entweder die Verknüpfung der Datei vor der Erstellung einer neuen Datei aufgehoben oder (in BSD-Systemen mit -S-Schalter) eine neue Datei erstellt und der Zielname atomar umbenannt, wodurch die Wettlaufsituation zwischen Installation und erneutem Öffnen vermieden wird . Wenn dies nicht verwendet wird, kann das Kopieren (mit ETXTBSY) für eine laufende Binärdatei fehlschlagen oder einen Absturz verursachen, wenn eine Bibliotheksdatei oder eine Datendatei ersetzt wird.
  • Richten Sie die richtigen Anmeldeinformationen für die neue Datei ein, ohne dass separate Befehle erforderlich sind.
  • Erstellen Sie bei Bedarf Zwischenverzeichnisse.
  • Vermeiden Sie das Ändern einer Zieldatei, wenn diese mit der neuen Version (Schalter -C) identisch ist.

Es folgt also dem Unix-Ansatz, dass ein Tool für eine einzelne, aber vollständige Aktion zum Installieren einer Datei erstellt werden soll, die von einem bestimmten Build-Tool an seinem Arbeitsspeicherort erstellt wurde.

Das von mir beschriebene Gesamtkonzept ist in BSD-Systemen implementiert (in der sogenannten "xinstall" -Version); Ich betrachte hier den "Safe Copy" -Modus (neue Version mit atomarer Umbenennung) als unerlässlich. Linux-Systeme (von coreutils) übersehen diesen wichtigen Teil und neigen dazu, zwischen dem Löschen und dem erneuten Öffnen durch einen Zuschauerprozess hin und her zu rennen. Dies hätte jedoch von Paketmanagern abgedeckt werden können.

Netch
quelle
2
Die Verwendung von installoder $(INSTALL)in Makefiles kennzeichnet diese Schritte auch als Installationskopierschritte und nicht als gewöhnliche Kopierschritte. Das könnte nützlich sein.
Kaz
Ich stoße auf das Rennen in der Coreutils-Installation ... Gibt es eine Lösung oder eine Alternative, die dies korrekt ausführt?
Trent
@trentw was für ein Rennen?
Netch
8

Abgesehen von den vorherigen Beschreibungen zur Verwendung gibt es einen geringen Unterschied zwischen cpund install, zumindest unter Linux. Beim Kopieren über eine vorhandene Datei wird cpder vorhandene Inode der Datei überschrieben, während installimmer ein neuer Inode mit demselben Dateinamen erstellt wird.

Dies macht einen Unterschied, wenn eine neue Version einer laufenden Binärdatei installiert wird. Die Verwendung cpverursacht einen EBUSY-Fehler, der installjedoch erfolgreich ist. Die ausgeführte Binärdatei verwendet weiterhin die alte Version, die neue Version wird jedoch verwendet, wenn das Programm neu gestartet wird.

Tomas Skäre
quelle
Das ist interessant ... So kann es eine Datei mit dem gleichen Namen, aber verschiedenen Inode erstellen?
Neaţu Ovidiu Gabriel
1
@ NeaţuOvidiuGabriel Ja. Für den Benutzer gibt es nur eine Datei, da Dateien normalerweise nach Namen durchsucht werden. Für das Dateisystem gibt es jedoch zwei Dateien, sofern ein Prozess einen Verweis auf die alte Datei enthält. Dasselbe kann erreicht werden, wenn Sie eine von einem Prozess geöffnete Datei umbenennen oder löschen und anschließend eine neue Datei mit demselben Dateinamen erstellen.
Tomas Skäre
4

Wenn das betreffende Verzeichnis bereits existiert:

  • mkdir -p wird versuchen, die Besitz- und Dateimodusbits zu setzen
  • install -d wird nicht versuchen, die Besitz- und Dateimodusbits zu setzen

Dies ist für mkdirund installvon GNU Coreutils . Beide verwenden die gleiche make_dir_parentsFunktion, wobei jedoch der preserve_existingParameter auf falsebzw. gesetzt truewird.

Alexander
quelle
1
Nützliche Unterscheidung!
Victor