install コマンド
installコマンドはファイルのコピーと同時にパーミッションや所有者を設定するコマンド。Makefileのインストールターゲットなどでよく使われる。
installコマンドはファイルのコピーだけでなく、-dオプションでディレクトリも作成できる。パーミッションや所有者の設定を1コマンドで完結できるため、mkdirとchmod、chownを組み合わせるより簡潔に記述できる。
ディレクトリを作成する(-d)
-dオプションを使うと、指定した名前のディレクトリを作成する。
$ install -d foo
$ ls -ld foo
drwxr-xr-x 2 root root 4096 Jun 12 15:02 foo
mkdir -pと同様に、存在しない親ディレクトリもまとめて作成する。
$ install -d foo/bar/baz
$ ls -ld foo foo/bar foo/bar/baz
drwxr-xr-x 3 root root 4096 Jun 12 15:02 foo
drwxr-xr-x 3 root root 4096 Jun 12 15:02 foo/bar
drwxr-xr-x 2 root root 4096 Jun 12 15:02 foo/bar/baz
ディレクトリがすでに存在する場合もエラーにならない。
$ install -d foo
$ echo $?
0
複数のディレクトリを一度に作成できる。
$ install -d dir1 dir2 dir3
$ ls -ld dir1 dir2 dir3
drwxr-xr-x 2 root root 4096 Jun 12 15:02 dir1
drwxr-xr-x 2 root root 4096 Jun 12 15:02 dir2
drwxr-xr-x 2 root root 4096 Jun 12 15:02 dir3
-vオプションをつけると、作成したディレクトリを表示する。
$ install -d -v /var/www/app/uploads
install: creating directory '/var/www'
install: creating directory '/var/www/app'
install: creating directory '/var/www/app/uploads'
パーミッションを指定する(-m)
-mオプションでパーミッションを指定してディレクトリを作成する。
$ install -d -m 750 secure
$ ls -ld secure
drwxr-x--- 2 root root 4096 Jun 12 15:02 secure
mkdirしてからchmodする2ステップを1コマンドにまとめられる。
setgidビットなどの特殊なパーミッションも指定できる。
$ install -d -m 2775 shared
$ ls -ld shared
drwxrwsr-x 2 root root 4096 Jun 12 15:02 shared
-mオプションが適用されるのは引数に指定したディレクトリのみである。途中の親ディレクトリはデフォルトのパーミッション(755)で作成される。
$ install -d -m 750 ins/a/b
$ ls -ld ins ins/a ins/a/b
drwxr-xr-x 3 root root 4096 Jun 12 15:02 ins
drwxr-xr-x 3 root root 4096 Jun 12 15:02 ins/a
drwxr-x--- 2 root root 4096 Jun 12 15:02 ins/a/b
所有者とグループを指定する(-o / -g)
-oオプションで所有者、-gオプションでグループを指定してディレクトリを作成する。所有者やグループの指定にはroot権限が必要である。
$ sudo install -d -m 2775 -o nobody -g nobody /var/www/app/uploads
$ ls -ld /var/www/app/uploads
drwxrwsr-x 2 nobody nobody 4096 Jun 12 15:02 /var/www/app/uploads
mkdir -p、chmod、chownの3コマンドを1コマンドにまとめられる。
# install -d を使わない場合は3コマンド必要
$ sudo mkdir -p /var/www/app/uploads
$ sudo chmod 2775 /var/www/app/uploads
$ sudo chown nobody:nobody /var/www/app/uploads
mkdir -p との違い
install -dとmkdir -pはどちらも親ディレクトリを含めてディレクトリを作成する。ただし、既存ディレクトリへの挙動が異なる。
mkdir -pは既存ディレクトリに対して何もしない。一方、install -dは既存ディレクトリに対してもパーミッションや所有者を設定する。
$ mkdir existing
$ ls -ld existing
drwxr-xr-x 2 root root 4096 Jun 12 15:02 existing
$ install -d -m 700 existing
$ ls -ld existing
drwx------ 2 root root 4096 Jun 12 15:02 existing
既存ディレクトリのパーミッションが700に変更される。冪等にディレクトリの状態を揃えたい場合に便利である。逆に、既存ディレクトリのパーミッションを維持したい場合は注意が必要である。
主な違いは以下である。
| install -d | mkdir -p | |
|---|---|---|
| 親ディレクトリの作成 | できる | できる |
| パーミッション指定 | -mオプション | -mオプション |
| 所有者・グループ指定 | -o / -gオプション | できない(chownが必要) |
既存ディレクトリへの-m適用 | 適用される | 何もしない |
具体例
アプリケーション用ディレクトリの作成
Webアプリケーションのデータディレクトリを、所有者とパーミッションを指定して作成する。
$ sudo install -d -m 750 -o app -g app /var/lib/myapp /var/log/myapp
$ ls -ld /var/lib/myapp /var/log/myapp
drwxr-x--- 2 app app 4096 Jun 12 15:02 /var/lib/myapp
drwxr-x--- 2 app app 4096 Jun 12 15:02 /var/log/myapp
複数のディレクトリへ同じ設定を一度に適用できる。
Makefile での利用
Makefileのインストールターゲットでは、installコマンドでディレクトリ作成とファイル配置を統一的に記述できる。
install:
install -d -m 755 $(DESTDIR)/usr/local/bin
install -m 755 myapp $(DESTDIR)/usr/local/bin/
ディレクトリ作成からファイル配置までinstallコマンドで完結する。
デプロイスクリプトでの利用
デプロイスクリプトで、実行のたびにディレクトリの状態を揃える。
#!/bin/bash
set -e
install -d -m 2775 -o deploy -g www-data /var/www/app/shared/log
install -d -m 2775 -o deploy -g www-data /var/www/app/shared/tmp
ディレクトリが存在しなければ作成し、存在すればパーミッションと所有者を設定し直す。何度実行しても同じ状態になるため、冪等なスクリプトを記述できる。
