Fish shell 在制表符完成时报告“数学:错误:缺少运算符”

Fish shell 在制表符完成时报告“数学:错误:缺少运算符”

我今天早上注意到了这个错误,但我认为我昨晚没有改变任何东西,所以我现在很困惑。也许我更新了系统上的一些实用程序,但它以某种方式破坏了向后兼容性。基本上我math: Error: Missing operator在使用制表符补全时遇到了错误。

假设我输入fish,然后点击以获取类似和 的Tab建议(这里有一个 asciinema 截屏视频,以防您想查看它的实际效果:fish_configfish_add_pathhttps://asciinema.org/a/L3xr32eVMGHuCY0Gjr19gFzCu

[I] ~ $ fishmath: Error: Missing operator
'Wed Dec 31 18:00:00 CST 1969 - 1655913830'
 ^
[I] ~ $ fish_config
fish                                                                               (command)
fish_add_path
fish_breakpoint_prompt
fish_clipboard_copy
…and 29 more rows

制表符补全确实​​有效,但错误看起来很烦人。看起来我正在尝试评估数据字符串或其他东西。如何诊断错误?


我使用的是 macOS 蒙特利。这是我的~/.config/fish/config.fish

set -px PATH /opt/local/bin /opt/local/sbin
set -px PATH $HOME/.local/bin
set -px PATH $HOME/bin
set -px PATH /Applications/MacPorts/Alacritty.app/Contents/MacOS
set -px PATH $HOME/Foreign/drawterm
set -px PATH $HOME/google-cloud-sdk/bin

set -x XDG_CONFIG_HOME $HOME/.config
set -x PIPENV_VENV_IN_PROJECT 1
set -x PLAN9 /usr/local/plan9

set -px PATH $PLAN9/bin

if test -e $HOME/.config/fish/sensitive.fish
    source $HOME/.config/fish/sensitive.fish
end

if status is-interactive
    # Commands to run in interactive sessions can go here
    alias vi='/opt/local/bin/nvim'
    set -gx EDITOR /opt/local/bin/nvim
    source /opt/local/share/fzf/shell/key-bindings.fish
end

set -g fish_key_bindings fish_hybrid_key_bindings

alias matlab='/Applications/MATLAB_R2021b.app/bin/matlab -nodisplay'

zoxide init fish | source

direnv hook fish | source

# The next line updates PATH for the Google Cloud SDK.
if [ -f '/Users/qys/google-cloud-sdk/path.fish.inc' ]; . '/Users/qys/google-cloud-sdk/path.fish.inc'; end

答案1

删除该行后,错误消失set -px PATH $PLAN9/bin。我想这是因为我不小心将一些系统实用程序与它的对应项隐藏起来用户空间的计划 9

另一种解决方法是使用set -ax PATH $PLAN9/bin。通过使用-a,目录$PLAN9/bin会被附加到$PATH(与使用 时的前置相反-p),因此 中已经存在的命令$PATH优先于 Plan 9 的命令。

答案2

这里发生的情况是,fish 尝试完成命令,并尝试通过调用向命令添加描述apropos

在 macOS 上,这非常慢,因为 Apple 的沙箱破坏了 Whatis 数据库。

因此,fish 添加了自己的缓存,并且该缓存每周更新一次。

只是为了检查那个日期,它运行

set age (math (date +%s) - (/usr/bin/stat -f %m $whatis))

给出date格式+%s说明符以获取 UNIX 纪元。

你已经date用(典型的)超极简主义来取代计划9版本,它不接受格式参数,因此最终会打印完整的日期,这使得数学表达式格式错误。

一般来说,fish 假设有一个相当标准的 unix 用户空间,因此在前面添加 Plan 9 工具(实际上不是)是一个坏主意。

相关内容