使用されている多くの場所で見たことがあるinstall -d
はディレクトリを作成し、install -c
ファイルをコピーします。 mkdir
とcp
を使用しないのはなぜですか? install
を使用する利点はありますか?
それはあなたが何をしているかに依存します。
install
コマンドは通常、システムにバイナリをインストールするためのパッケージおよびソースコードに付属するインストールスクリプトで使用されます。他のファイルやディレクトリのインストールにも使用できます。 -d
および-c
オプションに加えて、インストールするファイルの新しい権限を指定するための-m
があるため、cp
を実行する必要はありません。同じ結果を得るにはchmod
を使用します。例えば:
install -m644 "$srcdir/$pkgname-$pkgver-linux64" "$pkgdir/opt/$pkgname"
ターゲットグループと所有者をそれぞれ設定するためのオプション-g
と-o
もあります。これにより、chown
を個別に呼び出す必要がなくなります。一般に、install
を使用すると、スクリプトが短くなり、ファイルの作成、コピー、モード設定、および関連するものを1つのコマンドで多くではなく1つのコマンドで実行できるため、スクリプトがより簡潔になります。
参照については、man install
を参照してください。使用方法については、パッケージ ソースコード に同梱されているインストールスクリプトをご覧ください。
「インストール」は通常、次のアクションを組み合わせたものです。
したがって、Unixのアプローチに従って、いくつかのビルドツールによって作成されたファイルを作業場所にインストールするという、1つの完全なアクションのためのツールを作成する必要があります。
私が説明した完全な概念は、BSDシステム(いわゆる「xinstall」バージョン)に実装されています。ここでは、「セーフコピー」モード(アトミックな名前変更を備えた新バージョン)をこれに不可欠なものとして扱います。 (coreutilsからの)Linuxシステムはこの重要な部分を見逃しており、傍観者プロセスによる削除と再オープンの間で競合する傾向があります。しかし、これはパッケージマネージャーによってカバーされている可能性があります。
使用法に関するここまでの説明とは別に、少なくともLinuxでは、cp
とinstall
の間にわずかな違いがあります。既存のファイルをコピーする場合、cp
はファイルの既存のiノードを上書きしますが、install
は常に同じファイル名の新しいiノードを作成します。
これにより、実行中のバイナリの新しいバージョンをインストールするときに違いが生じます。 cp
を使用するとEBUSYエラーが発生しますが、install
は成功します。実行中のバイナリは引き続き古いバージョンを使用しますが、プログラムを再起動すると新しいバージョンが使用されます。
問題のディレクトリがすでに存在する場合:
mkdir -p
は、所有権とファイルモードビットを設定しようとしますinstall -d
は、所有権およびファイルモードビットを設定しようとしません。これは、_ GNU coreutils のmkdir
およびinstall
の場合です。どちらも同じ make_dir_parents
関数ですが、preserve_existing
パラメータは、それぞれfalse
またはtrue
に設定されています。