Зачем использовать install, а не cp и mkdir?

68

Я видел во многих местах, используемых install -dдля создания каталогов и install -cкопирования файлов. Почему бы не использовать mkdirи cp? Есть ли преимущество в использовании install?

Неау Овидиу Габриэль
источник

Ответы:

59

Это зависит от того, что вы делаете.

Команда installобычно используется в сценариях установки, которые поставляются с пакетами и исходным кодом для установки бинарного файла в вашу систему. Его также можно использовать для установки любого другого файла или каталога. В дополнение к -dи -cварианты у вас есть -mдля определения новых разрешений файла для установки, так что вы не должны делать cpи chmodполучить тот же результат. Например:

install -m644 "$srcdir/$pkgname-$pkgver-linux64" "$pkgdir/opt/$pkgname"

У вас также есть варианты -gи -oдля установки целевой группы и владельца соответственно. Это позволяет избежать отдельных звонков chown. В целом, использование installсокращает ваш сценарий и делает его более кратким, делая создание файлов, копирование, настройку режима и связанные вещи одной командой вместо многих.

Для справки см man install. Для использования просто взгляните на любой скрипт установки, поставляемый с некоторым исходным кодом пакета .


источник
22

«install» обычно сочетает в себе следующие действия:

  • Копирование указанного файла в целевое место, что делается в отношении процессов, которые используют старую копию. В отличие от «cp», «install» либо отменяет связь с файлом перед созданием нового, либо (в системах BSD с ключом -S) создает новый и атомарно переименовывает имя получателя, что позволяет избежать расы между установкой и повторным открытием. , Если не использовать это, копирование может завершиться с ошибкой (с ETXTBSY) для работающего двоичного файла или вызвать сбой при замене файла библиотеки или файла данных.
  • Установите правильные учетные данные для нового файла без необходимости использования отдельных команд.
  • Сделайте промежуточные каталоги, если требуется.
  • Избегайте изменения целевого файла, если он идентичен новой версии (ключ -C).

Таким образом, из подхода Unix следует, что инструмент должен быть создан для единственного, но полного действия по установке файла, созданного каким-либо строительным инструментом, на его рабочее место.

Полная концепция, как я описал, реализована в системах BSD (в так называемой версии "xinstall"); Здесь я рассматриваю режим «безопасного копирования» (новая версия с атомарным переименованием) как жизненно важный для этого. Системы Linux (из coreutils) пропускают эту важную часть и склонны к гонкам между удалением и повторным открытием процессом прохождения; но это могло бы быть покрыто менеджерами пакетов.

Netch
источник
2
Использование installили $(INSTALL)в make-файлах также помечает эти шаги как шаги копирования установки, а не как обычные шаги копирования. Это может быть полезно.
Каз
Я сталкиваюсь с гонкой в ​​установке coreutils ... есть ли исправление или альтернатива, которая делает это правильно?
Трент
@trentw какая гонка?
Нетч
8

Помимо предыдущих описаний, касающихся использования, существует небольшая разница между уровнями cpи install, по крайней мере, в Linux. При копировании поверх существующего файла cpперезаписывает существующий индекс файла, но installвсегда создает новый индекс для того же имени файла.

Это имеет значение при установке новой версии работающего двоичного файла. Использование cpвызывает ошибку EBUSY, пока installбудет успешным. Работающий бинарный файл все равно будет использовать старую версию, но новая версия будет использоваться, если программа будет перезапущена.

Томас Скере
источник
Это интересно ... Так может ли он создать файл с тем же именем, но с другим индексом?
Неау Овидиу Габриэль
1
@ NeaţuOvidiuGabriel Да. Для пользователя будет только один файл, так как файлы обычно ищутся по имени. Но для файловой системы существует два файла, если какой-то процесс содержит ссылку на старый файл. То же самое может быть достигнуто, если вы переименуете или удалите файл, открытый процессом, а затем создадите новый файл с тем же именем файла.
Томас Скере
4

Если рассматриваемый каталог уже существует:

  • mkdir -p попытается установить биты владения и режима файла
  • install -d не будет пытаться установить владение и биты режима файла

Это для mkdirи installиз GNU coreutils . Они оба используют одну и ту же make_dir_parentsфункцию, но с preserve_existingпараметром, установленным в falseили true, соответственно.

Александр
источник
1
Полезная дифференциация!
Виктор,