Pourquoi utiliser install plutôt que cp et mkdir?

68

J'ai vu dans de nombreux endroits install -dcréer des répertoires et install -ccopier un fichier. Pourquoi ne pas utiliser mkdiret cp? Y a-t-il un avantage à utiliser install?

Neaţu Ovidiu Gabriel
la source

Réponses:

59

Cela dépend de ce que vous faites.

Cette installcommande est normalement utilisée dans les scripts d'installation fournis avec les packages et le code source pour installer un fichier binaire sur votre système. Il peut également être utilisé pour installer tout autre fichier ou répertoire. En plus des options -det que -cvous avez -mpour spécifier les nouvelles autorisations du fichier à installer, vous n'avez donc pas besoin d'effectuer les opérations a cpet a chmodpour obtenir le même résultat. Par exemple:

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

Vous avez également des options -get -opour définir le groupe cible et le propriétaire, respectivement. Cela évite les appels séparés à chown. En général, l'utilisation installraccourcit votre script et le rend plus concis en créant des fichiers, en les copiant, en définissant les paramètres de mode et les éléments associés dans une seule commande au lieu de plusieurs.

Pour référence, voir man install. Pour l’utiliser, jetez un coup d’œil à tous les scripts d’installation livrés avec le code source d’un paquet .


la source
22

"installer" combine généralement les actions suivantes:

  • Copie du fichier spécifié à l'emplacement cible, ce qui est fait en ce qui concerne les processus qui utilisent une ancienne copie. Contrairement à "cp", "install" dissocie le fichier avant la création d'un nouveau fichier ou (dans les systèmes BSD, avec le commutateur -S) en crée un nouveau et renomme le nom de la cible de manière atomique, ce qui évite la situation critique entre l'installation et la réouverture. . Sinon, la copie pourrait échouer (avec ETXTBSY) pour un fichier binaire en cours d'exécution ou provoquer un blocage si un fichier de bibliothèque ou un fichier de données est remplacé.
  • Définissez les informations d'identification appropriées dans le nouveau fichier sans avoir besoin de commandes séparées.
  • Créez des répertoires intermédiaires, si nécessaire.
  • Évitez de modifier un fichier cible s'il est identique à la nouvelle version (commutateur -C).

Donc, il suit l'approche Unix qu'un outil doit être créé pour une action unique mais complète d'installation d'un fichier créé par un outil de construction à son emplacement de travail.

Le concept complet décrit ci-dessus est implémenté dans les systèmes BSD (dans la version dite "xinstall"); Je considère ici que le mode "copie conforme" (nouvelle version avec renommage atomique) est essentiel. Les systèmes Linux (de coreutils) manquent cette partie importante et sont sujets à des courses entre suppression et réouverture par un processus de contrôle; mais cela aurait pu être couvert par les gestionnaires de paquets.

Netch
la source
2
L'utilisation de installou $(INSTALL)dans les makefiles indique également que ces étapes sont des étapes de copie d'installation et non des étapes de copie ordinaires. Cela pourrait être utile.
Kaz
Je rencontre la course dans l'installation de coreutils ... y a-t-il un correctif, ou une alternative qui le fait correctement?
Trent
@trentw quel genre de course?
Netch
8

Outre les descriptions précédentes concernant l’utilisation, il existe une faible différence de niveau entre cpet install, du moins sous Linux. Si vous copiez un fichier existant, cpécrasez l'inode existant du fichier, tout installen créant toujours un nouvel inode pour le même nom de fichier.

Cela fait une différence lors de l'installation d'une nouvelle version d'un binaire en cours d'exécution. L'utilisation cpprovoque une erreur EBUSY, alors installréussira. Le binaire en cours utilisera toujours l'ancienne version, mais la nouvelle version est utilisée si le programme est redémarré.

Tomas Skäre
la source
C'est intéressant ... Donc, il peut créer un fichier avec le même nom mais un inode différent?
Neaţu Ovidiu Gabriel
1
@ NeaţuOvidiuGabriel Oui. Pour l'utilisateur, il n'y aura qu'un seul fichier, car les fichiers sont généralement recherchés par leur nom. Mais pour le système de fichiers, il existe deux fichiers tant qu'un processus contient une référence à l'ancien fichier. La même chose peut être obtenue si vous renommez ou supprimez un fichier ouvert par un processus, puis créez un nouveau fichier portant le même nom de fichier.
Tomas Skäre
4

Si le répertoire en question existe déjà:

  • mkdir -p va essayer de définir les bits de propriété et de mode de fichier
  • install -d ne tentera pas de définir les bits de propriété et de mode de fichier

Ceci est pour mkdiret installde GNU coreutils . Ils utilisent tous les deux la même make_dir_parentsfonction, mais avec le preserve_existingparamètre en cours de réglage sur falseou true, respectivement.

Alexandre
la source
1
Différenciation utile!
Victor