实际上我的文件中有这些行(示例).zshrc
:
. ${TOOLS_HOME}/cli/.cli_base
. ${TOOLS_HOME}/cli/.cli_functions
. ${TOOLS_HOME}/cli/.cli_symlinks
到目前为止效果很好。我唯一的问题是,在这些.cli_xxx
文件中我没有语法突出显示(对于别名来说这是可以的 - 但对于函数来说这是非常困难的)。
所以我尝试了这个:
. ${TOOLS_HOME}/cli/cli_base.sh
. ${TOOLS_HOME}/cli/cli_functions.sh
. ${TOOLS_HOME}/cli/cli_symlinks.sh
但是(正如我在谷歌上看到的那样).
就像source
当我获取我的.zshrc
文件并执行别名时我有时会收到此错误消息:
bash:30: maximum nested function level reached
那是因为“多源”?
有人喜欢存储和版本控制别名/函数/符号链接的“最佳实践”,还是我必须保留我的.cli_xxxx
文件?
答案1
.zshrc
我怀疑,如果您在原始状态下获取,该问题与文件名完全无关也会发生。
错误原因
当您从函数内部调用函数时,通常会发生此错误,从而导致递归。当您为函数指定与该函数中使用的外部命令或内置命令相同的名称时,可能会无意中发生这种情况。例如:
echo () {
echo "Out: " $@
}
在定义此函数之前,该命令echo
可以正常工作,但在定义之后,该命令将失败并出现以下错误:
% echo foobar
echo:1: maximum nested function level reached; increase FUNCNEST?
(消息文本的差异可能是由于使用的 zsh 版本造成的,在我的例子中是 5.6.2)
它也可以通过多个函数相互调用来发生:
foo () {
echo $@
}
echo () {
something_else
foo $@
}
错误消息将显示由于达到嵌套限制而无法再调用的函数的名称以及发生此调用的函数行。所以在上述情况下:
% echo foobar
echo:1: maximum nested function level reached; increase FUNCNEST?
或者
% echo foobar
foo:2: maximum nested function level reached; increase FUNCNEST?
在这个问题的情况下,似乎bash
在某个函数的第 30 行调用了一个具有该名称的函数。
修复它
除非递归是故意的,否则可以通过告诉zsh
您要使用哪个非功能命令来防止这种情况。
如果您想要内置命令,只需在前面添加
builtin
:echo () { builtin echo "Out: " $@ }
如果您想要外部命令,请在前面添加
command
:echo () { command echo "Out: " $@ }
或者使用其完整路径
echo () { /bin/echo "Out: " $@ }
如果您不确定在配置bash
中使用的位置zsh
,可以使用递归grep
搜索${TOOLS_HOME}/cli/
:
grep -r bash ${TOOLS_HOME}/cli/