Fish Shell 入门体验

最近把日用Shell从bash切换到了fish,这里记录一些使用心得。

笔者的发行版:Kubuntu 22.04

介绍

官网:https://fishshell.com/

个人感觉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会将一部分可用的命令列举出来:

fish 提示

这时再按一次Tab,fish会列举所有可用的命令,然后你可以使用方向键在这些命令之间切换。按Esc键可以关闭提示。

实时更改命令配色

fish还会实时更改命令的配色。如果找不到当前输入的命令,那么命令会显示为红色,表示可能出错了。如果能够找到命令或者能够在当前的基础上补全出可用的命令,那么会显示为另一种颜色(可以定制),表示一切正常。

命令行参数提示

输入命令参数时,可以输入-后按Tab键,fish会给出可用的参数。据说这个是通过实时解析man page来实现的。虽然强大,不过笔者感觉对那些大型工具有些鸡肋,比如gcc的这个:

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

posted @ 2022-11-18 10:59  Eslzzyl  阅读(1213)  评论(0编辑  收藏  举报