Змінні середовища, що містять функції, - це баш-хак. Zsh не має нічого подібного. Можна зробити щось подібне за допомогою декількох рядків коду. Змінні середовища містять рядки; старіші версії bash, перш ніж Shellshock були відкриті, зберігали код функції в змінній, ім'я якої - функція, і за значенням якої () {
слідує код функції }
. Ви можете використовувати наступний код для імпорту змінних за допомогою цього кодування та спробувати запустити їх з налаштуваннями, подібними до bash. Зверніть увагу, що zsh не може імітувати всі функції bash, все, що ви можете зробити, це трохи наблизитись (наприклад, $foo
розділити значення та розширити підстановку та зробити масиви на основі 0).
bash_function_preamble='
emulate -LR ksh
'
for name in ${(k)parameters}; do
[[ "-$parameters[name]-" = *-export-* ]] || continue
[[ ${(P)name} = '() {'*'}' ]] || continue
((! $+builtins[$name])) || continue
functions[$name]=$bash_function_preamble${${${(P)name}#"() {"}%"}"}
done
(Як зазначив Стіфан Шазелас , оригінальний відкривач Shellshock, більш рання версія цієї відповіді могла б виконати довільний код у цей момент, якщо визначення функції було неправильним. Ця версія не відповідає, але звичайно, як тільки ви виконаєте будь-яку команду, це може бути функція, імпортована з навколишнього середовища.)
Пост-Shellshock версії функцій кодування bash у середовищі, використовуючи недійсні імена змінних (наприклад BASH_FUNC_myfunc%%
). Це ускладнює їх надійний аналіз, оскільки zsh не надає інтерфейс для вилучення таких імен змінних із середовища.
Я не рекомендую цього робити. Покладатися на експортовані функції в сценаріях - погана ідея: це створює невидиму залежність у вашому сценарії. Якщо ви коли-небудь запускаєте свій скрипт у середовищі, у якій немає вашої функції (на іншій машині, в роботі з хронічним процесом, після зміни файлів ініціалізації оболонок,…), ваш сценарій більше не працюватиме. Натомість збережіть усі свої функції в одному або декількох окремих файлах (щось на зразок ~/lib/shell/foo.sh
) та запустіть сценарії, імпортуючи функції, які він використовує ( . ~/lib/shell/foo.sh
). Таким чином, якщо ви модифікуєте foo.sh
, ви можете легко шукати, які сценарії покладаються на нього. Якщо ви скопіюєте скрипт, ви зможете легко дізнатися, які допоміжні файли йому потрібні.
Zsh (і ksh до цього) робить це більш зручним, забезпечуючи спосіб автоматичного завантаження функцій у сценарії, де вони використовуються. Обмеження полягає в тому, що ви можете помістити лише одну функцію на файл. Оголосіть функцію автозавантаженою і введіть визначення функції у файл, ім'я якого - ім'я функції. Помістіть цей файл у каталог, вказаний у $fpath
(який ви можете налаштувати за допомогою FPATH
змінної середовища). У своєму сценарії оголосіть функції автоматичного завантаження за допомогою autoload -U foo
.
Крім того, zsh може компілювати сценарії, щоб заощадити час розбору. Зателефонуйте, zcompile
щоб скласти сценарій. При цьому створюється файл із .zwc
розширенням. Якщо цей файл присутній, то autoload
завантажуватиме складений файл замість вихідного коду. Ви можете використовувати zrecompile
функцію для (повторної) компіляції всіх визначень функцій у каталозі.