为什么 fish shell不允许函数名为`-`

为什么 fish shell不允许函数名为`-`

我正在尝试使用 fish 作为我的默认交互式 shell。我以前使用的是 bash,它支持别名-(ASCII 连字符,0x2d)。为什么 fish 不允许创建具有此类名称的别名或函数?据我所知,它在 fish 中没有特殊含义。

alias无法进行类似 Bash 的调用:

fish-3.1.2$ alias -- -='aliased command'
- (line 1): function: Illegal function name '-'
function - --wraps 'aliased command' --description 'alias -=aliased command';  aliased command $argv; end
^
from sourcing file -
        called on line 61 of file /usr/share/fish/functions/alias.fish
in function 'alias' with arguments '-- -=aliased\ command'

答案1

别名只是 fish 函数的包装器,所以我可以确认在 Fish 3.3.1(本文发表时的当前版本)中,这不起作用:

function -
   echo "here"
end
fish: function: Illegal function name '-'

但是,有一个简单的解决方法,即使用 abbr(缩写):

abbr -a -- - 'cd -'

如果不清楚所有破折号的作用,双破折号“--”将模糊的命令选项与参数分开,以便后面的破折号“-”被识别为缩写的名称,而不是被解释为另一个选项,如“-a”。

在很多方面,缩写都比别名要好,因为它们不会掩盖您在历史记录中执行的真实命令,并且在 fish.conf 中设置大量别名的速度很慢,因为无论如何,所有这些别名都会被评估为函数,但不会获得延迟加载的好处。鱼类文档也证实了 abbr 是正确的方法

答案2

我去挖掘了一下历史,看起来这是在320cb6857f-修复了以 开头的函数名被解释为参数的问题。以 开头的函数-实际上不起作用,但此更改使其变得明确。

相关内容