在函数路径中使用较早的函数

Posted

技术标签:

【中文标题】在函数路径中使用较早的函数【英文标题】:Use Function From Earlier in Function Path 【发布时间】:2015-09-06 18:12:21 【问题描述】:

fish 中,是否可以在另一个同名函数中引用或使用一个函数?例如,fish/usr/local/share/functions/ls.fish 上有一个函数ls,它根据操作系统和外壳是否有颜色等设置一些默认参数。我想定义另一个函数,它会为我设置一些默认颜色,而不会破坏这个其他函数,以防我想使用更新版本的fish

设置别名的最简单方法似乎是使用command,如下所示:

function ls
    command ls -F $argv
end

在文件夹~/.config/fish/functions 中的文件ls.fish 中。这是用户定义函数的默认文件夹。此文件夹和~/.config/fish/functions 都在$fish_function_path 中,但~/.config/fish/functions 稍后出现,因此用户可以设置自己的函数来覆盖fish 的默认函数。然而,正如fish 文档所说,

command forces the shell to execute the program COMMANDNAME and ignore
any functions or builtins with the same name.

如何使用稍后在$fish_function_path 中定义的别名/函数来覆盖别名/函数,而不重写编写它?理想情况下,解决方案也将使用内置命令同名,如cd,根据引用的文档,这也是不可能的,但这不是必需的。

最后,这是个好主意吗?如果fish默认不这样做,那肯定是有原因的吧?

【问题讨论】:

【参考方案1】:

通常的技巧是复制要覆盖的函数,然后从覆盖中调用副本:

functions --copy ls saved_ls
function ls
    saved_ls
end

您不能在自动加载的 ls.fish 文件中执行此操作,因为它会导致无限循环,但您可以在 config.fish 中执行此操作。

【讨论】:

为什么会导致无限循环? ~/.config/fish/functions/ls.fish 文件是在 /usr/local/share/fish/functions/ls.fish 文件之后调用的,对吗?还是它们同时被调用,并且前一个文件中定义的函数覆盖后一个文件中的函数,但是在运行命令时它们同时被调用? 它只获取通过搜索$fish_function_path 找到的第一个ls.fish。所以~/.config 中的那个会掩盖/usr/local/share 中的那个。导致死循环的原因是执行ls.fish首先尝试复制ls,即自动加载ls,即执行ls.fish... 知道了,谢谢。这可能是要放入文档中的信息,假设它不存在并且我是盲人并且没有看到它。

以上是关于在函数路径中使用较早的函数的主要内容,如果未能解决你的问题,请参考以下文章

SQL 选择较早的日期(包括 NULL)

如何使用同一组中下一行的数据更新前一条记录

C语言:输入n和n个字符串,输出其中最短的字符串。若长度相同则输出出现较早的那一个

使用 GROUP BY 功能在 ADO.NET 中聚合函数

perforce:同步到较早的版本

从较早的行累积数组(PySpark 数据框)