Запуск функций, которые были объявлены вне моего сценария оболочки

349
Diego S.

В настоящее время мой ZSH имеет некоторые функции, например:

% declare -f ... a lot of shell functions appears here. 

В настоящее время я пишу сценарий оболочки, который будет вызывать определенную функцию из этого списка ( prompt_dirиз темы Power -vel9k для Oh-My-Zsh).

Мой сценарий:

#!/bin/zsh echo_prompt_segment(){ # bunch of source-code here }  zsh_oddeven_dir(){ prompt_dir echo }  zsh_oddeven_dir 

Проблема в том, что мой скрипт не может получить доступ к этим функциям:

% ./oddeven-pwd.sh zsh_oddeven_dir:1: command not found: prompt_dir 

Когда я делаю это declare -fизнутри скрипта, в моем скрипте есть только две функции:

% ./oddeven-pwd.sh  echo_prompt_segment () {  } zsh_oddeven_dir () { declare -f } 

Могу ли я получить доступ и запустить те функции, которые были объявлены выше моего скрипта? Если так, то как?

1
Пожалуйста, не добавляйте решение в тело вопроса. Вы можете [ответить на свой вопрос] (https://superuser.com/help/self-answer) в поле для ответа. Текст вашего решения все еще доступен [здесь] (https://superuser.com/revisions/1328518/2), поэтому вам не нужно перепечатывать. Кроме того, добавление «решено» в заголовок не то, что мы делаем на Super User. Принятие ответа достаточно, чтобы указать, что проблема решена. Kamil Maciorowski 6 лет назад 0

1 ответ на вопрос

1
AFH

Поскольку по умолчанию сценарии выполняются в подоболочках, вам требуется экспортировать функции, доступные в bash, но не в zsh.

В bashстандартном месте для добавления пользовательских функций находится в ~/.bashrc, но это не выполняется, если не bashявляется интерактивным (в частности, не в подоболочке, выполняющей сценарий), что экспортные функции преодолены.

Что, по-видимому, работает, согласно этому ответу, так это помещать объявления вашей функции ~/.zshenv, которые выполняются по умолчанию при каждом запуске, интерактивном или нет.

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

Хорошо, предыдущий принятый ответ направил меня, фактически увидев реальную проблему: независимо от `bash` или` zsh` (фактически мой сценарий и объявление функции были в `zsh`), когда я запускаю свой сценарий, он выполняется в отделенный процесс оболочки, поэтому он теряет ссылки на функции. Я решил проблему с помощью `source myscript.sh` вместо обычного запуска. Diego S. 6 лет назад 0
Извините, я должен был подчеркнуть, что сценарии по умолчанию запускаются в подоболочках. Я настолько привык к идее, что забыл, что не все об этом знают. Я расширил свой ответ, чтобы объяснить это, с некоторыми существенными моментами о том, как инициализируются оболочки AFH 6 лет назад 0

Похожие вопросы