Я видел во многих местах, используемых 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-файлах также помечает эти шаги как шаги копирования установки, а не как обычные шаги копирования. Это может быть полезно.