Fish Shell 入门体验
最近把日用Shell从bash切换到了fish,这里记录一些使用心得。
笔者的发行版:Kubuntu 22.04
介绍
个人感觉fish是一个把大部分高级功能都预先配置好的shell,前期不需要花太多的时间来定制。
fish有一点不方便就是它不兼容bash脚本,有些时候会比较麻烦。不过必要的时候可以执行bash
来进入bash环境,然后完成需要的工作,完成之后使用exit
回到fish环境即可。
安装
有些发行版已经在软件仓库中包含了fish,因此可以直接用软件包管理器安装。
Ubuntu的官方软件源中的版本比较旧,因此使用第三方软件源。
https://launchpad.net/~fish-shell/+archive/ubuntu/release-3
终端执行
sudo add-apt-repository ppa:fish-shell/release-3
sudo apt update
sudo apt install fish
就可以安装fish了。
卸载
把卸载部分放在这里似乎不太合适。不过笔者个人认为一个软件的卸载友好度和安装友好度同等重要。我这里就直接翻译官方文档的卸载方法了。
首先要确保fish不是你正在使用的shell,如果你不确定,执行chsh -s /bin/bash
。
如果你是用软件包管理器安装的fish,仅需使用软件包管理器的卸载功能进行卸载即可。如果你是编译安装的,假设你把fish装到了/usr/local
,那么执行:
rm -Rf /usr/local/etc/fish /usr/local/share/fish ~/.config/fish
rm /usr/local/share/man/man1/fish*.1
cd /usr/local/bin
rm -f fish fish_indent
使用
执行fish
命令,就可以进入fish shell。默认情况下,进入fish会显示两行问候语,这个问候语是可以定制的,当然也可以关掉。
> fish
Welcome to fish, the friendly interactive shell
Type help for instructions on how to use fish
you@hostname ~ >
如果你希望将fish作为默认shell,有几种办法。最简单的办法是直接修改终端模拟器(笔者使用Konsole)的启动shell,将原先的shell(比如bash)换成fish。在笔者的配置中,原先执行的命令是/bin/bash
,将其修改为/bin/fish
即可。
这个方法有另一个好处,就是它不改变系统的login shell。使用neofetch
等类似工具查看系统信息,会发现shell还是之前的设置,没有改变。有的系统(发行版)要求login shell必须是兼容bash的,否则一些环境变量会出问题,因此这种方法可以省去很多不必要的麻烦。
如果你希望直接把login shell改成fish,当然也是可以的,可以参考官方文档。
命令提示
fish会默认开启命令提示,你输入一部分命令,fish会将预测的命令的剩余部分用灰色字体显示。如果你希望采纳fish的提示,按右方向键,或者按Ctrl + F。如果你希望采纳部分提示(向前采纳一个词),那么使用Alt + 右方向键。
你也可以输入一部分命令,然后按Tab。fish会将一部分可用的命令列举出来:
这时再按一次Tab,fish会列举所有可用的命令,然后你可以使用方向键在这些命令之间切换。按Esc键可以关闭提示。
实时更改命令配色
fish还会实时更改命令的配色。如果找不到当前输入的命令,那么命令会显示为红色,表示可能出错了。如果能够找到命令或者能够在当前的基础上补全出可用的命令,那么会显示为另一种颜色(可以定制),表示一切正常。
命令行参数提示
输入命令参数时,可以输入-
后按Tab键,fish会给出可用的参数。据说这个是通过实时解析man page来实现的。虽然强大,不过笔者感觉对那些大型工具有些鸡肋,比如gcc
的这个:
891个选项谁看得完啊!(掀桌
(更多trick待补)
配置
fish的配置文件(类似于bash的~/.bashrc
)是~/.config/fish/config.fish
。这个文件的默认内容如下:
if status is-interactive
# Commands to run in interactive sessions can go here
end
更改问候语
在config.fish
中添加
function fish_greeting
end
在函数体内使用echo '[问候语]'
即可。比如echo 'Hello Fish!'
,那么fish启动时会输出问候语“Hello Fish!”。如果你不想要问候语,直接留空这个函数即可,它会覆盖fish的默认问候语。
更改配色
fish提供了一个方便的Web页面来调整配色和提示符样式。终端执行fish_config
,会在默认浏览器中打开这个Web页面。
选择你喜爱的配色方案,在页面顶部的大框右侧点击“Set Theme”,然后回到终端按下回车,就可以应用更改了。使用同样的方法可以调整提示符样式。你也可以自行微调配色方案。
更改命令提示符
命令提示符可以在~/.config/fish/config.fish
更改。
下面是默认的提示符的配置:
function fish_prompt -d "Write out the prompt"
# This shows up as USER@HOST /home/user/ >, with the directory colored
# $USER and $hostname are set by fish, so you can just use them
# instead of using `whoami` and `hostname`
printf '%s@%s %s%s%s > ' $USER $hostname \
(set_color $fish_color_cwd) (prompt_pwd) (set_color normal)
end
可以根据需要定制。比如笔者改成了
...
printf '%s:%s%s%s $ ' $USER \
(set_color $fish_color_cwd) (prompt_pwd) (set_color normal)
...
插件管理
社区维护了一些广受欢迎的fish插件管理器,包括:
这里是Fisher的作者写的对于Fisher、Fundle和Oh My Fish的对比。
笔者使用了Fisher这个管理器,下面介绍一下安装。
安装Fisher本体
官方的安装方法是在终端执行
curl -sL https://git.io/fisher | source && fisher install jorgebucaran/fisher
笔者实测,因为众所周知的原因,这个方法安装很困难。
手动安装的方法是将仓库中的functions/fisher.fish
保存下来,用fish执行它,并附加参数install来安装Fisher本体(注意Fisher不仅仅包含fisher.fish,因此不能只安装fisher.fish)。
你需要首先把Fisher的代码打包下载,放在磁盘的某个位置(笔者放在了~/fisher-plugins/fisher
),然后执行
fish fisher.fish ~/fisher-plugins/fisher
就可以离线安装了。离线是秒装的。装完后就可以删除临时保存的fisher.fish了。Fisher中包含的fisher.fish在~/.config/fish/functions
中,这也是其他各类Fisher插件的安装位置。
之后你就可以使用Fisher的完整功能了。
安装新插件
注意Fisher是支持从GitHub或GitLab在线安装插件的(这也是官方推荐的方法),但由于网络问题笔者没法这样干,只好手动维护插件。
假设我们要安装 https://github.com/jethrokuan/z。在线的安装方法是
fisher install jethrokuan/z
手动安装插件的方法和上面装Fisher本体的方法类似,打包下载插件的源代码,放在某个位置(笔者使用~/fisher-plugins/
),然后使用fisher install
+指定路径 来安装。注意Fisher虽然会把插件的脚本移动到~/.config/fish/functions/
,但它会记住插件的安装源,因此建议你保留这个位置,以备之后的更新。
更新插件
如果你是在线安装的,直接fisher update
就可以自动更新了。
手动安装的要麻烦一些。把新版插件的源代码打包下载,覆盖原先的位置,然后执行fisher update
。
卸载插件
使用fisher remove [插件]
。
有关Fisher的更多Documentation,请参考 https://github.com/jorgebucaran/fisher
插件推荐
z
待补
最后贴一篇比较赞同的评价fish和zsh的文章:https://www.zhihu.com/question/41076349/answer/118573097