我在.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脚本的名称。当我从zsh命令提示符运行“autoload ltbuild”时,它将该文件作为一个函数加载(因为它在我的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"
当我启动shell时:
[carl@desktop[ 3:06PM]:carl] echome
zsh: command not found: echome
[carl@desktop[ 3:06PM]:carl] autoload echome
[carl@desktop[ 3:07PM]:carl] echome
I'm a file running as a function
答案 0 :(得分:0)
应该注意:即使在浏览man zshbuiltins
之后,我也不知道为什么这不会打印“自动加载失败”。幸运的是,如果你遇到麻烦(邮件列表和IRC),zsh有一个很好的社区 - 他们值得使用。从他们的解释:
这不起作用,因为您没有正确自动加载该功能。你正在做的是自动加载一个名为/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