2013-09-26 4 views
0

У меня есть в нижней части моего .zshrcзапуска .zshrc в автозагрузку Баш скрипт как функция

[[ -e $HOME/.myapp/myapp.sh ]] && source $HOME/.myapp/myapp.sh 

myapp.sh нагрузки некоторые переменные среды из файла под названием script_properties

{ [[ -e $HOME/.myapp/script_properties ]] && source $HOME/.myapp/script_properties; } || {printf "Please run setup script to set build configuration defaults.\n" && exit; } 

и затем проверяет каталог (lt_shell_functions_dir), где есть некоторые сценарии bash, которые я хочу загрузить как функции zsh. Моя надежда состоит в том, чтобы иметь возможность из командной строки сделать что-то вроде «ltbuild», которое является именем сценария bash, который я хочу запустить как функцию. Когда я запускаю «autoload ltbuild» из командной строки zsh, он загружает файл как функцию (потому что он находится в моем fpath), и я могу запустить его. Когда я пытаюсь загрузить это изнутри скрипта, который выполняется при запуске, так что мне не нужно вводить «autoload ltbuild», он не работает. Я ценю помощь!

if [[ -d $lt_shell_functions_dir ]]; then 
    fpath=($lt_shell_functions_dir $fpath) 
    for function_file in $lt_shell_functions_dir/* 
    do 
    autoload $function_file || printf "Autoloading $function_file failed\n"   
    done 
    unset function_file 
else 
    printf "no $lt_shell_functions_dir exists.\n" 
fi 

Пример:

У меня есть файл с именем echome, который имеет в нем:

echo "I'm a file running as a function" 

Когда я запустить оболочку:

[[email protected][ 3:06PM]:carl] echome 
zsh: command not found: echome 
[[email protected][ 3:06PM]:carl] autoload echome 
[[email protected][ 3:07PM]:carl] echome 
I'm a file running as a function 

ответ

0

Следует отметить: Я понятия не имел, почему это не было printin g «автозагрузка не удалась», даже после просмотра man zshbuiltins. К счастью, zsh имеет хорошее сообщество, если вы когда-либо застряли (как списки рассылки, так и IRC) - их стоит использовать. Из их объяснения:

Это не работает, потому что вы не выполняете автозагрузку функции правильно. То, что вы делаете, это автозагрузка функции, называемой, например, /path/to/lt_shell_functions/echome. Что вы хотите делать, это автозагрузка функции, называемой echome.

Примечание: Разрешения в названиях функций разрешены /. Если вы попытаетесь выполнить автозагрузку функции, которая не была определена, zsh отметит функцию для загрузки позже - поэтому она не печатает для вас «автозагрузку».

Мое решение: Мы можем извлечь имя функции like this:

${function_file##/*} 

так что я бы изменить ваш ~/.zshrc сделать это:

autoload ${function_file##/*} || printf "Autoloading $function_file failed\n" 

, который работает:

Last login: Fri Jun 21 17:21:26 on ttys000 
$ tail -n 12 ~/.zshrc 
if [[ -d $lt_shell_functions_dir ]]; then 
    fpath=($lt_shell_functions_dir $fpath) 
    for function_file in $lt_shell_functions_dir/* 
    do 
     autoload -Uz ${function_file##*/} || printf "Autoloading $function_file failed\n" 
    done 
# unset function_file 
else 
    printf "no $lt_shell_functions_dir exists.\n" 
fi 
$ echome 
I'm in a file 

 Смежные вопросы

  • Нет связанных вопросов^_^