web-dev-qa-db-ja.com

なぜcpやmkdirではなくinstallを使うのですか?

使用されている多くの場所で見たことがあるinstall -dはディレクトリを作成し、install -cファイルをコピーします。 mkdircpを使用しないのはなぜですか? installを使用する利点はありますか?

70

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

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

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

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

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

61
user13742

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

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

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

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

24
Netch

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

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

12
Tomas Skäre

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

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

これは、_ GNU coreutilsmkdirおよびinstallの場合です。どちらも同じ make_dir_parents 関数ですが、preserve_existingパラメータは、それぞれfalseまたはtrueに設定されています。

4
Alexander