我正在尝试使用 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-
修复了以 开头的函数名被解释为参数的问题。以 开头的函数-
实际上不起作用,但此更改使其变得明确。