别名在 macOS 的 fish shell 中不起作用

别名在 macOS 的 fish shell 中不起作用

我一直在努力解决一个问题,但我找不到任何地方提到过这个问题,也无法追踪。我无法利用 fish 中的任何别名命令功能,这也会破坏依赖该命令的 fish 集成(例如zoxide init fish)。我可以手动定义别名(毕竟它们只是函数),但像这样的命令alias ls "ls -lah"不起作用。

我怀疑它似乎更喜欢将其解释alias为 macOS 可执行文件,而不是内置的 fish:

> alias foo="echo foo"
> foo
fish: Unknown command: foo
> type -a alias
alias is /usr/bin/alias
> alias --help
/usr/bin/alias: line 4: alias: --: invalid option
alias: usage: alias [-p] [name[=value] ... ]

我在我的配置中手动定义了许多鱼别名并且它们可以工作,只是alias内置的本身似乎坏了。

跟进

有些人要求提供不适合在评论中添加的更多详细信息:

> fish --version
fish, version 3.7.0
> set -S fish_function_path
$fish_function_path: set in global scope, unexported, with 6 elements
$fish_function_path[1]: |/Users/<REDACTED>/.config/fish/functions|
$fish_function_path[2]: |/opt/homebrew/etc/fish/functions|
$fish_function_path[3]: |/Users/<REDACTED>/.local/share/fish/vendor_functions.d|
$fish_function_path[4]: |/opt/homebrew/Cellar/fish/3.7.0/share/fish/vendor_functions.d|
$fish_function_path[5]: |/opt/homebrew/share/fish/vendor_functions.d|
$fish_function_path[6]: |/opt/homebrew/Cellar/fish/3.7.0/share/fish/functions|

答案1

我只需使用abbr反而:

abbr -a ls ls -lah

缩写更好,原因如下:

  • 如果您覆盖基本命令(例如)ls,它们会让您根据需要跳过自动扩展。遇到这种情况并不罕见,如果发生这种情况,您不必暂时删除别名。
  • 它们与自动完成功能配合得更好
  • 它们将原始扩展命令保存在历史记录中。如果这是您自己的机器,并且您更喜欢保存别名来记住它们,那么这可能是一个小小的缺点。但除此之外,如果与多人一起工作,保存原始命令会使调试更容易。

答案2

原来问题出在函数自动加载- 我有一个~/.config/fish/functions/alias.fish包含一些别名的文件,但这导致 fish 无法读取主定义,/opt/homebrew/Cellar/fish/3.7.0/share/fish/functions/alias.fish因为 fish 明确查找名称与函数名称匹配的第一个文件。重命名文件解决了这个问题。

相关内容