Навіщо використовувати встановлення, а не cp та mkdir?


Відповіді:


57

Це залежить від того, що ти робиш.

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

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

У вас також є варіанти -gі -oдля установки цільової групи і власника, відповідно. Це дозволяє уникнути окремих дзвінків на chown. Взагалі, використання програми installскорочує ваш сценарій і робить його більш коротким, роблячи створення файлів, копіювання, налаштування режиму та пов'язані з ними речі в одній команді замість багатьох.

Для довідки див man install. Для використання просто подивіться на будь-який сценарій встановлення, який постачається з деяким вихідним кодом пакета .


21

"встановити", як правило, поєднує в собі такі дії:

  • Копіювання вказаного файлу в цільове місце, що робиться стосовно процесів, які використовують стару копію. На відміну від "cp", "встановити" або від’єднає файл перед створенням нового, або (в системах BSD, з -S перемикачем) створює нове і перейменовується на цільове ім'я атомним шляхом, що дозволяє уникнути перегонового стану між установкою та повторним відкриттям . Якщо цього не використовувати, копіювання може не вдатися (за допомогою ETXTBSY) для запущеного бінарного файлу або призвести до збою, якщо замінити файл бібліотеки або файл даних.
  • Встановіть належні облікові дані для нового файлу, не потребуючи окремих команд.
  • Складіть проміжні каталоги, якщо вони вимагають.
  • Уникайте модифікації цільового файлу, якщо він ідентичний новій версії (-C перемикач).

Отже, згідно з підходом Unix, слід створити інструмент для єдиного, але повного дії встановлення файлу, виготовленого деяким будівельним інструментом, на його робоче місце.

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


2
Використання installабо $(INSTALL)в makefiles також позначає ці кроки як встановлення кроків копіювання, а не звичайних кроків копіювання. Це може бути корисно.
Каз

Я зіткнувся з гонкою встановлення Coreutils ... чи є виправлення чи альтернатива, яка робить це правильно?
трент

@trentw яка раса?
Netch

8

Крім попередніх описів щодо використання, існує низька різниця між рівнями cpі install, принаймні, в Linux. Якщо копіюється через існуючий файл, cpперезаписується існуючий inode файлу, при цьому installзавжди створюється новий inode для того ж імені файлу.

Це має значення, коли встановлюється нова версія запущеного бінарного файлу. Використання cpпризводить до помилки EBUSY, хоча це installбуде успішним. Запущений бінарний файл все ще використовуватиме стару версію, але нова версія використовується, якщо програма перезапущена.


Це цікаво ... Тож він може створити файл з такою ж назвою, але іншим inode?
Неацу Овідіу Гавриїл

1
@ NeaţuOvidiuGabriel Так. Користувачеві залишиться лише один файл, оскільки файли, як правило, шукаються за назвою. Але для файлової системи є два файли, якщо деякий процес містить посилання на старий файл. Те ж саме можна досягти, якщо ви перейменовуєте або видалите файл, відкритий процесом, а потім створіть новий файл з тим же ім’ям файлу.
Томаш Скар

4

Якщо відповідний каталог вже існує:

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

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


1
Корисна диференціація!
Віктор
Використовуючи наш веб-сайт, ви визнаєте, що прочитали та зрозуміли наші Політику щодо файлів cookie та Політику конфіденційності.
Licensed under cc by-sa 3.0 with attribution required.