Я бачив у багатьох місцях, які використовуються install -dдля створення каталогів та install -cкопіювання файлів. Чому б не використовувати mkdirі cp? Чи є перевага у використанні install?
Я бачив у багатьох місцях, які використовуються install -dдля створення каталогів та install -cкопіювання файлів. Чому б не використовувати mkdirі cp? Чи є перевага у використанні install?
Відповіді:
Це залежить від того, що ти робиш.
installКоманда зазвичай використовуються в сценаріях установки , які приходять з пакетами і вихідним кодом для установки двійкового коду в вашу систему. Він також може бути використаний для встановлення будь-якого іншого файлу чи каталогу. На додаток до -dта -cопцій, які ви маєте -mдля визначення нових дозволів встановленого файлу, тому вам не потрібно робити a cpі a, chmodщоб отримати той самий результат. Наприклад:
install -m644 "$srcdir/$pkgname-$pkgver-linux64" "$pkgdir/opt/$pkgname"
У вас також є варіанти -gі -oдля установки цільової групи і власника, відповідно. Це дозволяє уникнути окремих дзвінків на chown. Взагалі, використання програми installскорочує ваш сценарій і робить його більш коротким, роблячи створення файлів, копіювання, налаштування режиму та пов'язані з ними речі в одній команді замість багатьох.
Для довідки див man install. Для використання просто подивіться на будь-який сценарій встановлення, який постачається з деяким вихідним кодом пакета .
"встановити", як правило, поєднує в собі такі дії:
Отже, згідно з підходом Unix, слід створити інструмент для єдиного, але повного дії встановлення файлу, виготовленого деяким будівельним інструментом, на його робоче місце.
Повна концепція, як я описав, реалізована в системах BSD (у так званій "xinstall" версії); Тут я вважаю режим "безпечної копії" (нова версія з атомним перейменуванням) як життєво важливий для цього. Системи Linux (від coreutils) пропускають цю важливу частину і схильні до перегонів між видаленням і повторним відкриттям процесом сторонніх; але це могли покрити менеджери пакунків.
Крім попередніх описів щодо використання, існує низька різниця між рівнями cpі install, принаймні, в Linux. Якщо копіюється через існуючий файл, cpперезаписується існуючий inode файлу, при цьому installзавжди створюється новий inode для того ж імені файлу.
Це має значення, коли встановлюється нова версія запущеного бінарного файлу. Використання cpпризводить до помилки EBUSY, хоча це installбуде успішним. Запущений бінарний файл все ще використовуватиме стару версію, але нова версія використовується, якщо програма перезапущена.
Якщо відповідний каталог вже існує:
mkdir -p спробує встановити біти права власності та файлуinstall -d не намагатиметься встановити біти права власності та файлуЦе для mkdirта installвід GNU coreutils . Вони обидва використовують одну і ту ж make_dir_parentsфункцію, але з preserve_existingпараметром встановлюється відповідно falseабо true.
installабо$(INSTALL)в makefiles також позначає ці кроки як встановлення кроків копіювання, а не звичайних кроків копіювання. Це може бути корисно.