Я видел во многих местах, используемых install -d
для создания каталогов и install -c
копирования файлов. Почему бы не использовать mkdir
и cp
? Есть ли преимущество в использовании install
?
Я видел во многих местах, используемых 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
сокращает ваш сценарий и делает его более кратким, делая создание файлов, копирование, настройку режима и связанные вещи одной командой вместо многих.
Для справки см man install
. Для использования просто взгляните на любой скрипт установки, поставляемый с некоторым исходным кодом пакета .
«install» обычно сочетает в себе следующие действия:
Таким образом, из подхода Unix следует, что инструмент должен быть создан для единственного, но полного действия по установке файла, созданного каким-либо строительным инструментом, на его рабочее место.
Полная концепция, как я описал, реализована в системах BSD (в так называемой версии "xinstall"); Здесь я рассматриваю режим «безопасного копирования» (новая версия с атомарным переименованием) как жизненно важный для этого. Системы Linux (из coreutils) пропускают эту важную часть и склонны к гонкам между удалением и повторным открытием процессом прохождения; но это могло бы быть покрыто менеджерами пакетов.
Помимо предыдущих описаний, касающихся использования, существует небольшая разница между уровнями cp
и install
, по крайней мере, в Linux. При копировании поверх существующего файла cp
перезаписывает существующий индекс файла, но install
всегда создает новый индекс для того же имени файла.
Это имеет значение при установке новой версии работающего двоичного файла. Использование cp
вызывает ошибку EBUSY, пока install
будет успешным. Работающий бинарный файл все равно будет использовать старую версию, но новая версия будет использоваться, если программа будет перезапущена.
Если рассматриваемый каталог уже существует:
mkdir -p
попытается установить биты владения и режима файлаinstall -d
не будет пытаться установить владение и биты режима файлаЭто для mkdir
и install
из GNU coreutils . Они оба используют одну и ту же make_dir_parents
функцию, но с preserve_existing
параметром, установленным в false
или true
, соответственно.
install
или$(INSTALL)
в make-файлах также помечает эти шаги как шаги копирования установки, а не как обычные шаги копирования. Это может быть полезно.