cpおよびmkdirではなくinstallを使用する理由


回答:


59

それはあなたが何をしているかに依存します。

このinstallコマンドは通常、システムにバイナリをインストールするためのパッケージとソースコードが付属するインストールスクリプトで使用されます。他のファイルまたはディレクトリをインストールするためにも使用できます。インストールするファイルの新しい権限を指定するためのオプション-d-cオプションに加えて、同じ結果を得るために-ma cpとa chmodを実行する必要はありません。例えば:

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

また、オプションを持っている-g-o、それぞれ、ターゲットグループと所有者を設定します。これにより、への個別の呼び出しが回避されますchown。一般に、使用installすると、スクリプトが短くなり、ファイルの作成、コピー、モード設定、および関連する処理が多くのコマンドではなく1つのコマンドで実行されるため、スクリプトが簡潔になります。

参照については、を参照してくださいman install。使用方法については、パッケージのソースコードに同梱されているインストールスクリプトをご覧ください。


22

「インストール」は、通常、次のアクションを組み合わせます。

  • 指定されたファイルのターゲット場所へのコピー。これは、古いコピーを使用するプロセスに関して行われます。「cp」とは異なり、「install」は、新しいファイルを作成する前にファイルのリンクを解除するか、(BSDシステムでは-Sスイッチを使用して)新しいファイルを作成し、ターゲット名にアトミックに名前を変更します。 。これを使用しないと、実行中のバイナリファイルのコピーが(ETXTBSYで)失敗したり、ライブラリファイルまたはデータファイルが置き換えられた場合にクラッシュしたりする可能性があります。
  • 個別のコマンドを必要とせずに、新しいファイルに適切な資格情報を設定します。
  • 要求された場合、中間ディレクトリを作成します。
  • ターゲットファイルが新しいバージョンと同じ場合は、ターゲットファイルの変更を避けます(-Cスイッチ)。

したがって、Unixのアプローチに従って、何らかのビルドツールによって作成されたファイルをその作業場所にインストールするという、単一ではあるが完全なアクションのためにツールを作成する必要があります。

私が説明した完全な概念は、BSDシステム(いわゆる「xinstall」バージョン)に実装されています。ここでは、「セーフコピー」モード(アトミックな名前変更を伴う新しいバージョン)をこれに不可欠なものとして扱います。Linuxシステム(coreutilsから)は、この重要な部分を見逃しており、傍観者プロセスによる削除と再オープンの間で競合する傾向があります。ただし、これはパッケージマネージャーでカバーできます。


2
また、makefile での使用はinstall$(INSTALL)これらのステップに、通常のコピーステップではなく、インストールコピーステップとしてフラグを立てます。それは役に立つかもしれません。
カズ

coreutilsインストールで競合が発生しています...これを修正する、またはこれを正しく行う代替手段はありますか?
トレント

@trentwどんなレース?
Netch

8

ここでの使用法に関する前述の説明とは別に、少なくともLinuxでは、との間にはわずかなレベルの違いがcpありinstallます。既存のファイルをコピーする場合cpは、ファイルの既存のiノードを上書きしますが、install常に同じファイル名の新しいiノードを作成します。

これにより、実行中のバイナリの新しいバージョンをインストールするときに違いが生じます。を使用cpするとEBUSYエラーが発生しますが、install成功します。実行中のバイナリは引き続き古いバージョンを使用しますが、プログラムを再起動すると新しいバージョンが使用されます。


それは興味深いことです...それで、同じ名前で異なるiノードを持つファイルを作成できますか?
NeaţuOvidiuさんガブリエル

1
@NeaţuOvidiuGabrielはい。ファイルは通常、名前で検索されるため、ユーザーには1つのファイルしかありません。ただし、ファイルシステムには、何らかのプロセスが古いファイルへの参照を保持している限り、2つのファイルがあります。プロセスによって開かれたファイルの名前を変更または削除してから、同じファイル名で新しいファイルを作成した場合も、同じことが実現できます。
トマススケーレ

4

問題のディレクトリが既に存在する場合:

  • mkdir -p 所有権とファイルモードビットを設定しようとします
  • install -d 所有権とファイルモードビットを設定しようとしません

これがためであるmkdirinstallからのGNU coreutilsの。どちらも同じmake_dir_parents関数を使用しpreserve_existingますが、パラメーターがそれぞれfalseまたはに設定されていtrueます。


1
便利な差別化!
ビクター
弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.