По-перше, ви можете розглянути можливість простої заміни /bin/bashна більш оновлену версію.
По-друге, якщо вам не зручно скасовувати гарантію, роблячи це, і якщо у вас вже є проблеми з існуючим сценарієм, обійдіть його #!рядок, посилаючись на його:
/path/to/bash4/path/to/script.bashargs...
(Ви можете просто використовувати, bashа не повний шлях, якщо ваш $PATHправильний порядок.)
По-третє, якщо цей скрипт є специфічним для пристроїв Apple і повинен мати Bash версії 4, то завжди встановлюйте його явно #!/path/to/bash4, оскільки немає користі встановлювати його ні на що інше. (Це не означає змінити його у вихідному репо, а скоріше вибрати його під час встановлення; див. Нижче.)
По-четверте, подумайте про використання https://gist.github.com/kurahaupo/8130030 - зауважте, що вам потрібна "вихідна" версія сценарію за межами призначеного binкаталогу; наприклад, залиште це у своєму вихідному репо або в `li.
По-п’яте, якщо ви дійсно не хочете торкатися оригінального сценарію, зробіть сценарій заглушки, який викликає його:
#!/bin/sh
exec /path/to/bash4 /path/where/you/stashed/the/original/script "$@"
і встановіть його у відповідний binкаталог.
Джерело проти розгортання
Ваш запит щодо встановлення #!рядка у вихідному репо виказує надзвичайно поширене непорозуміння щодо сценаріїв: ідея про те, що сценарій, просто тому, що це "текст", не повинен "готуватися до використання" в будь-якому сенсі.
Для інших типів програм очевидно: їх потрібно скласти. І якщо вони великі сценарії python або perl, їм потрібен пакет або інсталятор, який буде включати будь-які залежності модуля.
Але навіть навіть скрипту оболонки потрібно, як мінімум, встановити право власності та дозволи та розмістити в binкаталозі. Зазвичай це буде або коли пакет побудований для класу пристроїв, або коли сценарій встановлений на цільовому пристрої. Це також відповідний час для встановлення #!лінії відповідно до середовища розгортання.
Я НЕ рекомендую#!/usr/bin/env bash
Широке поширення реклами #!/usr/bin/envтрохи послаблює загальну безпеку, але таким чином, що, ймовірно, не вкусить людей, які її пишуть, лише користувачів десь вниз. Тому я не рекомендую цього; Дійсно, я прогнозую, що врешті-решт він повернеться і кусає ваших клієнтів, або клієнтів ваших клієнтів, або клієнтів ваших клієнтів ... клієнтів.
Це рекламується як "портативний", але це насправді не так: пристроїв Android та OpenWRT навіть не /usrнабагато менше /usr/bin/env, тому там він зовсім марний. Тож на практиці основними бенефіціарами є користувачі Apple.
Якщо сценарій вимагає нової версії bash, тоді системна версія просто не буде робити, тому безглуздо використовувати її як резервну. Але якщо вам не потрібна остання версія, то встановити її як / bin / bash - це нормально.
Коротше кажучи, якщо ви розгортаєте скрипт в Apple, для якого потрібна версія Bash 4, то вам слід користуватися #!/path/to/bash4, коли ви збираєте сценарій у встановлений пакет, або коли сценарій встановлюється на певному пристрої.
EDIT
Я замінив /usr/local/bin/bashз /path/to/bash4тому , що викликало деяке замішання. Суть не в тому, що /usr/local/bin/bashслід використовувати, а в тому, що повний шлях до bash4, який би він не був, повинен бути чітко вказаний. Якщо ви не знаєте його перед установкою, дивлячись в $PATH тому розумне , що потрібно зробити, але ви хочете запустити короткий тест , як
bash_path=$( type -p bash )
if ! "$bash_path" -c '(( $BASH_VERSION > 4.2 ]]'
then
echo "ERROR: $bash_path isn't new enough"
exit 1
fi
{
printf '#!%s\n' "$bash_path"
tail -n+2 "$downloaded_file"
} > "$installpath"
chmod a=rx "$installpath"