由于它在多个终端使用时会覆盖我的历史记录,所以我想关闭该功能fc -W
。不幸的是,我有经常打字的习惯。
我认为不可能创建别名,因为fc -W
.
所以我尝试制作一个函数,如下所示:
# Make sure to never invoke fc -W
fc(){
for x; do
if [[ "${x}" == -W ]]; then
echo "I'm sorry Dave. I'm afraid I can't do that."
return
fi
done
fc "${@}"
}
但是,现在调用fc "${@}"
调用自身,我得到了无限递归。通常我会通过使用 eg/usr/bin/fc
而不是 来避免这种情况fc
,但是:
$ type fc
> fc is a shell builtin
在这种情况下如何避免无限递归?或者是否有更好的方法来禁用命令的一个标志?
使用
builtin
:fc
这将确保调用内置命令。样式:诊断消息应进入标准错误流,并且函数在失败时应返回非零状态:
您可以覆盖内置命令或外部命令或具有别名的函数。在执行别名时,不会扩展具有相同名称的别名。因此,如果别名的扩展使用别名的名称,这将调用同名的内置或外部命令或函数。这意味着您可以以一种简单的方式使用别名来将额外的选项传递给命令。但是由于别名扩展的工作方式,您不能做更多的事情——它是一个简单的单词替换,没有评估。
您可以使用函数覆盖内置命令或外部命令。具有特定名称的函数当前正在执行的事实不会影响执行,特别是不会影响函数名称的含义:它一直引用该函数。递归函数在 shell 编程中并不常见,但也没有反对它们的规则。
command
在 POSIX shell 中,您可以通过在调用之前放置来强制名称引用内置或外部命令。换句话说,command
绕过别名和函数。在 zsh 中,command
强制调用外部命令(除非posix_builtins
设置了该选项),即它也绕过内置命令。要强制执行 zsh 中的内置命令,请使用builtin
内置命令。这导致了一种解决方案:在您的包装函数中,调用
builtin fc
而不是fc
.但是,这不一定是您情况下的最佳解决方案,因为您的函数将在任何地方调用,包括
fc
从其他函数调用。当您覆盖内置行为时,我建议坚持使用别名。别名仅适用于您在命令行键入的内容或使用.
(akasource
)加载的内容,不适用于加载的函数autoload -U
(这是自动加载函数的推荐方法)。因此,定义一个fc
调用包装函数的别名,并为包装函数指定一个不同的名称。我把
\fc
而不是fc
放在函数定义中。从别名定义之前加载定义时,这不是必需的.zshrc
,但这是必需的,例如,如果您在交互式会话期间编辑或重新加载函数定义。我也对该功能进行了一些小改进:fc -WI
. 这并不完全可靠,因为它还会捕获诸如fc -R -- -W
(从名为 的文件中读取历史记录-W
)之类的调用,但对于此用例来说已经足够了。