По-перше, ви можете розглянути можливість простої заміни /bin/bash
на більш оновлену версію.
По-друге, якщо вам не зручно скасовувати гарантію, роблячи це, і якщо у вас вже є проблеми з існуючим сценарієм, обійдіть його #!
рядок, посилаючись на його:
/path/to/bash4
/path/to/script.bash
args...
(Ви можете просто використовувати, 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"