[РЕШЕНО] Zsh. автозагрузка функций для скриптов

~/.zshenv
fpath=(${DIR}/fns ${fpath})

~/.zshrc.local
autoload -U ${DIR}/fns/*(:t)
${DIR} - путь где лежит папка со скриптами (fns)

в терминале всё прекрасно работает как в основном так и в дочерних процессах, а вот в скриптах не хочет
точнее, если запускать так
% .  ./script
работает

а вот так
% ./script
уже не хочет, и вместо вывода функций в скрипте выдаёт - command not found

как правильно приготовить autoload функции для своих скриптов ?

-------------------------------------------------------------------------
Решение:
вместо ~/.zshrc.local использовать ~/.zshenv или /etc/zsh/zshenv
Я не специалист по zsh, но в стандартном шелле точка означает исполнение фрагмента кода (то, что нужно для подключения функций из него) , а простой вызов по имени запускает отдельный скрипт в отдельном процессе, и разумеется, никакие функции из него после завершения доступны не будут.
source (она же и точка) позволяет выполнять команды скрипта в контексте текущего экземпляра (процесса) интерпретатора, без этого скрипт выполняется в дочернем процессе.
Natrio
и разумеется, никакие функции из него после завершения доступны не будут.
мне не нужно из него мне нужно в самом скрипте и его дочерних процессах.

для ясности приведу пример

имеем простую функцию
${DIR}/fns/func1

echo "PPID=$PPID PID=$$"

~/.zshenv и ~/.zshrc.local аналогичны первому посту

имеем, к примеру, такой скрипт в котором должна запускаться наша ф-я func1
script.sh

#!/usr/bin/env zsh
func1

пробуем запускать напрямую в нашем интерпретаторе

% exec zsh
% echo $$
2078
% # запускаем нашу ф-ю
% func1
PPID=1870 PID=2078
% # запускаем ф-ю в дочернем процессе
% zsh
% func1
PPID=2078 PID=2145
% exit
% # как видим всё отлично работает

теперь запускаем нашу функцию через скрипт
Первый вариант

% exec zsh
% echo $$
2078
% # запускаем наш скрипт
% source ./script.sh
% PPID=1870 PID=2078
% # всё работает

Второй вариант

% exec zsh
% echo $$
2078
% # запускаем наш скрипт
% ./script.sh
% command not found: func1
% # неработает

надо заметить если в наш скрипт добавить то что мы добавляли в .zshrc.local, а конкретно в нашем случае autoload -U func1 то всё прекрасно выводится, но это не очень хороший вариант так как предполагается наличие множество ф-й которые запускаются (часть из них) во многих дочерних процессах(скриптах).
как заставить нормально экспортироваться autoload ф-и для скриптов ?
попробуй прописать
autoload -U ${DIR}/fns/*(:t)
в ~/.zshenv
Псевдографический инсталлятор Arch Linux ver. 3.8.2
Благодарности принимаются на ЯД 410012815723874
Не работает у вас именно "в дочерних процессах".

Когда вы запускаете новый интерактивный экземпляр шелла, он не наследует функции, а заново загружает их из того же конфига.

Когда вы запускаете скрипт, он всегда запускается в новом процессе, а поскольку этот процесс не интерактивный, он не читает ваш конфиг и не загружает ваши функции.

Чтобы функции загружались для не интерактивного шелла (скрипта), вам нужно найти такой конфиг, который будет читаться в любом случае, или изменить процедуру начальной конфигурации шелла так, чтобы он всегда загружал ваши функции. Как это делается в zsh – вопрос к специалистам по нему.
nafanja
попробуй прописать
autoload -U ${DIR}/fns/*(:t)
в ~/.zshenv
...

Natrio, спасибо, я примерно догадывался что интерактивный (командная строка интерпретатора zsh) и не интерактивный (скрипты) режим немного разные вещи, и что собака зарыта именно в начальной инициализации, а примеры для интерактивного режима (мне по сути он и не нужен) я привёл чтобы показать общую работоспособность задачи.

давайте тогда поправлю вопрос: как правильно инициализировать автозагрузку ф-й для скриптов средствами zsh ?
nafanja
попробуй прописать
autoload -U ${DIR}/fns/*(:t)
в ~/.zshenv
nafanja, большое спасибо, так всё отлично работает
правда, на сколько это Ъ не знаю, так как рекомендуют там хранить только переменные, но главное что работает )

у меня глюки или изначально твой пост был другой, про .zlogin ?
red
у меня глюки или изначально твой пост был другой, про .zlogin ?
да, я сначала не в тему написал, потом поправил.
Псевдографический инсталлятор Arch Linux ver. 3.8.2
Благодарности принимаются на ЯД 410012815723874
чуть внимательней почитал нашу вики
Autostarting applications

Zsh always executes /etc/zsh/zshenv and $ZDOTDIR/.zshenv so do not bloat these files.

If the shell is a login shell, commands are read from /etc/profile and then $ZDOTDIR/.zprofile. Then, if the shell is interactive, commands are read from /etc/zsh/zshrc and then $ZDOTDIR/.zshrc. Finally, if the shell is a login shell, /etc/zsh/zlogin and $ZDOTDIR/.zlogin are read.

так что таки да, zshenv наше всё
 
Зарегистрироваться или войдите чтобы оставить сообщение.