私は多くのMakefileでinstall
コマンドが使用されているのを見てきましたが、その存在と使用法はちょっと混乱しています。マンページからは、機能が少ないcp
の模造品のように見えますが、cp
よりもいくつかの利点がない限り、それは使用されないと思います。どうしたんだ?
install
は、ファイルをコピーするだけでなく、その所有権と権限を変更し、オプションで実行可能ファイルからデバッグシンボルを削除します。 cp
とchown
、chmod
およびstrip
を組み合わせたものです。これは、基本的なタスクの一般的なシーケンスを実行するための便利な高レベルツールです。
実行可能ファイルをインストールする場合のinstall
に対するcp
の利点は、ターゲットがすでに存在する場合、ターゲットファイルを削除して新しいファイルを作成することです。これにより、アクセスコントロールリストや機能などの現在のプロパティが取り除かれます。これらは、良い面と悪い面の両方として見ることができます。実行可能ファイルを更新するとき、この実行可能ファイルの実行中のインスタンスがある場合、影響を受けずに実行し続けます。対照的に、cp
は、ファイルが存在する場合、その場所でファイルを更新します。ほとんどのUnixバリアントでは、ターゲットが実行中の実行可能ファイルである場合、これはエラーEBUSY¹で失敗します。一部では、コードセクションを動的に読み込み、ファイルを変更すると無意味なコードが読み込まれるため、ターゲットがクラッシュする可能性があります。
install
はBSDコマンドです( 4.2BSD で追加、つまり1980年代初頭に追加)。 POSIXでは採用されていません。
¹ 「テキストファイルがビジーです」。この文脈では、「テキストファイル」は、 不明瞭な履歴上の理由から 、「バイナリ実行可能ファイル」を意味します。
これは、単一のコマンドで、ファイルのコピーまたはディレクトリの作成中に、ファイルまたはディレクトリの所有権と権限を操作する標準化された方法を提供します。
install
コマンドを使用すると、必要な権限でファイルをコピーできます
LDAPのセットアップ中に主に使用する例
install -o ldap -g ldap /etc/openldap/DB_CONFIG_EXAMPLE /var/lib/ldap/DB_CONFIG
これにより、chown ldap. /var/lib/ldap/DB_CONFIG
、cp
を使用してコピーした場合、このシナリオではchown
も必要です
install
のmanページを参照してください:
$ man install
抜粋
SYNOPSIS
install [OPTION]... [-T] SOURCE DEST
install [OPTION]... SOURCE... DIRECTORY
install [OPTION]... -t DIRECTORY SOURCE...
install [OPTION]... -d DIRECTORY...
DESCRIPTION
This install program copies files (often just compiled) into
destination locations you choose. If you want to download and
install a ready-to-use package on a GNU/Linux system, you should instead
be using a package manager like yum(1) or apt-get(1).
In the first three forms, copy SOURCE to DEST or multiple SOURCE(s) to
the existing DIRECTORY, while setting permission modes and
owner/group. In the 4th form, create all components of the given
DIRECTORY(ies).
Mandatory arguments to long options are mandatory for short options too.
特定の所有権、権限でのインストール、元のファイルのタイムスタンプの保持など、その他の便利な機能もinstall
を使用して実現できます。
-g, --group=GROUP
set group ownership, instead of process' current group
-m, --mode=MODE
set permission mode (as in chmod), instead of rwxr-xr-x
-o, --owner=OWNER
set ownership (super-user only)
-p, --preserve-timestamps
apply access/modification times of SOURCE files to corresponding
destination files