fish shell环境变量的坑

前言

前段时间入了fish-shell的坑,将其作为默认的shell,发现很多环境变量都失效了,比如$PATH$GOPATH等等,这里记录一下解决方案。

标题党一下,互联网上很多文章写的都是垃圾。要么互相复制,要么没有彻底解决问题。

问题

fish-shell作为默认shell后,重启终端,很多命令都无法使用,报command not found。甚至很多系统自带的命令也无法使用,比如lsrm, vim等等。

这导致我甚至没有办法将fish的配置文件删除或修改回原来的样子,因为rm, vim, touch等都无法使用。

目前为止我的终端彻底成为了摆设。

解决方案

分析一下,很多命令无法使用。那么大概率是$PATH变量的问题。

首先,使用echo $PATH查看一下$PATH的值,发现/usr/local/bin/usr/bin都不在$PATH中。

使用绝对路径,来调用vim命令修改配置文件:

1
/usr/bin/vim ~/.config/fish/config.fish

发现配置文件内有这么一行:

1
set -e PATH

-e参数代表将$PATH设置为空,所以导致了这个问题的根源。

加上这行配置是因为,将fish-shell置为默认shell后,要重新设置$PATH。直接设置的话,终端会报$PATH重复设置的错误,类似于Golang里面的map并发读写错误。所以才加上了清除$PATH的命令。

问题的原因出现了,我清除$PATH之后,没有将/usr/local/bin/usr/bin等系统级路径加入到$PATH中。

这里将几个路径加入进去后,问题就解决了。附上我的配置文件:

1
2
3
4
5
set -Ux GOROOT xxx
set -Ux GOPATH xxx
set -e PATH
set -Ux PATH /usr/local/sbin /usr/local/bin /usr/sbin /usr/bin /sbin /bin /usr/games /usr/local/games /snap/bin $PATH
set -Ux PATH $GOROOT/bin $GOPATH/bin $PATH

-U参数代表全局变量,可以在不同的fish进程中使用。-x参数类似与bash中的export,代表将变量导出到子进程中。

这样启动终端后,就可以正常使用了。

updatedupdated2024-01-292024-01-29