Fish中Man失效的解决
Fish 中Man失效的解决
一直用的fish, 今天突然man 用不了了,例如输入
1 |
|
终端提示我
1 |
|
于是我查看当前man的环境变量设置:
1 |
|
得到:
1 |
|
所以不知道为什么, Ocaml的环境配置突然把MANPATH给覆盖了
在网上搜索一些解决办法,基本上都没用,因为是针对bash的,我最开始还以为bash和fish的差别不大,后来发现还是有一些差别。
例如网上一些解答:
1 |
|
yum命令都无法识别,可能是CentOS? 我是WSL2(Ubuntu 20.04)
或者
1 |
|
更新一下database,无效,这不是db的问题
或者设置alias:
1 |
|
这个会报错递归什么的,我也不清楚,因为你单次执行
1 |
|
是可以的,然后alias的var在重启shell之后也会失效
然后介绍一些基础知识
什么是环境变量?
环境变量是操作系统提供给应用程序访问的简单 key / value字符串;windows/linux/mac都有同样的概念。
一般用于提供参数值给不同的应用程序。
介绍了一些Linux下的环境变量分类:全局环境变量、用户环境变量、临时环境变量
- 全局环境变量放在
/etc/profile
中,这些环境变量对系统中的所有用户都有效; - 用户环境变量放在用户的home目录下也就是
~/.bashrc
- 临时环境变量是在shell上赋值输出的环境变量,只在当前shell有效。
所有的环境变量可以通过
1 |
|
查看
那么当我查看/etc/profile 或者 ~/.bashrc里面的内容之后,都没有找到关于MANPATH的信息,
关于使用vim查找的技巧:
在normal mode(就是最开始不做任何切换的模式),按下 / 即可进入查找模式,输入要查找的字符串并按下回车,例如
1
/MANPATH
然后按下 Enter(回车), Vim会跳转到第一个匹配
按下 n 查找下一个,按下 N 查找上一个
但是输入
1 |
|
还是能打印出所有环境变量,部分如下所示:
1 |
|
可以看到这里我的MANPATH存在于环境变量之中
所以我就十分疑惑,在profile或者.bashrc里面都没有看到MANPATH,这些环境变量到底放在哪?
那么事实上最后我还是没能解决这个疑惑,但是搞清楚了一些fish不一样的地方,例如
对于Linux, 设置临时环境变量是
1 |
|
于是网上告诉你去设置:
1 |
|
但是这是临时的,关闭shell重启就会失效, (事实上这条命令对fish没用,返回错误1)
想要实现永久有效,可以根据你希望将它设置成全局环境变量还是用户环境变量,来写到/etc/profile 或 ~/.bashrc里面
然后执行
1 |
|
但是可能是一些语法不兼容,当我将 MANPATH="/usr/share/man"
写到~/.bashrc并source时,会报错(即使什么都不写,只是执行source ~/.bashrc 也会报下面这个错误)
1 |
|
提升我case语句没有写在switch块内,我个人不太懂script的语法,也就没明白。
区别
fish 没有 export, 而是通过 set -x 命令设置环境变量,例如
1 |
|
fish不支持 key=value
这种形式,只能使用set
其次,这条命令只对当前的shell有效,重启后失效,
而
1 |
|
这条命令是设置一个通用变量,在fish中,变量引用顺序是local –> global –> universal
如果失效了,原因往往是已经存在同名的全局变量
官网的解释如下:
A global variable of the same name already exists.
Environment variables such as EDITOR
or TZ
can be set universally using set -Ux
. However, if there is an environment variable already set before fish starts (such as by login scripts or system administrators), it is imported into fish as a global variable. The variable scopes are searched from the “inside out”, which means that local variables are checked first, followed by global variables, and finally universal variables.
This means that the global value takes precedence over the universal value.
To avoid this problem, consider changing the setting which fish inherits. If this is not possible, add a statement to your configuration file (usually ~/.config/fish/config.fish
):
1 |
|
那么fish中与.bash 或 .profile等价的文件叫做~/.config/fish/config.fish
因此我们在这个文件里面加入
1 |
|
然后保存重启,就可以了,现在打印$MANPATH:
1 |
|
虽然还是有OCaml的man,但是我们加入的已经追加到前面了,然后就可以使用man了, 并且重启shell也没有失效
1 |
|
[参考1]
[参考2]
[参考3]
本博客所有文章除特别声明外,均采用 CC BY-SA 4.0 协议 ,转载请注明出处!