HomeAuthorContactSearch

新一代命令行工具 - Fish Shell

还在用 oh-my-zsh?试试 fish shell

相比传统的bash,zsh,fish保留了绝大部分函数,优化了脚本逻辑语法。如果只是喜欢omz的插件,很少写脚本,可以无痛迁移至fish。
image.png

对比Oh-My-Zsh

常用插件一应俱全,自带代码高亮,自动补全等常用功能。

image.png

omz配置比起fish的开箱即用,繁琐很多。简化配置是大趋势,实际上绝大多数用户只需要常用的几个插件。这体现在方方面面,看看Parcel,Caddy的热度就知道了。
fish的启动速度与响应速度更快。说到底,omz还是套了一层壳,插件数量变多以后启动速度堪忧。
fish支持可视化配置,如主题,函数,变量等。

开始使用

更详细的使用方法参考官网文档

安装

安装大同小异,打开fish shell官网,查看适合自己系统的安装方法,这里以Mac OS为例。

$ brew install fish

切换默认shell

如果没有通过任何包管理器,手动安装fish,那你首先需要运行下面的命令将fish添加进shell列表中:

$ echo /usr/local/bin/fish | sudo tee -a /etc/shells

接下来切换默认shell

$ chsh -s /usr/local/bin/fish

重启命令行程序即可看到效果,如果要换回去的话,替换后面的shell路径即可。

配置初始命令

fish并不兼容传统配置文件如,bashrc, .profile等。打开~/.config/fish/config.fish(没有的话自己新建一个)键入初始命令。与传统shell不同的是,fish使用set命令设置环境变量:

# ~/.config/fish/config.fish
set M2_HOME "/Users/wsq/.maven/apache-maven-3.6.0"

值得注意的是,fish会识别该目录下的所有.fish文件,读取顺序暂时没有弄清楚,不过config.fish内的命令一定是最先运行的。最好的办法是将顺序敏感的命令放在config.fish文件中,再新建一个conf.d目录分别存放不同程序的相关命令,像Nginx一样。

使用包管理工具安装插件

社区内有很多优秀的fish shell包管理工具,这里以fisher为例。

安装

$ curl https://git.io/fisher --create-dirs -sLo ~/.config/fish/functions/fisher.fish

管理插件

使用fisher可以方便地管理各种命令行插件,以z为例:

$ fisher add jethrokuan/z

插件已经安装成功,接下来尝试一下

$ cd ~/.config/fish
$ cd
$ z fish

兼容现有脚本文件

由于fish采用了不同的语法,常见的脚本文件几乎都不支持fish shell,这也是变革带来痛处。对于一些独立的,不适用环境变量的脚本程序,我们可以直接用bash运行它:

# ~/.config/fish/config.fish
function xxx
  bash xxx.sh $argv
end

对于另一些需要读取甚至修改环境变量的脚本程序来说,这种方法则无能为力, 如nvs等。使用bass插件可以将传统shell语法转化为fish的语法,但是这种方法不太稳定, 偶尔会得到奇怪的错误:

$ fisher add edc/bass
# ~/.config/fish/config.fish
function nvs
  bass source ~/.nvs/nvs.sh ';' nvs $argv
end

可视化配置

直接键入下面的命令即可

$ fish_config

image.png