记录一下关于fish的使用和配置。

概述

fishzsh是最常见的两种用于替代默认bash的现代shell,两者的定位有点区别:

  • fish对用户友好,开箱即用,不需要复杂配置,缺点是语法与bash不兼容
  • zsh兼容bash的语法,缺点是必须进行较复杂的配置,否则和bash使用体验差不多。

对这些shell的主题配置,通常都会基于oh-my-zshoh-my-fish以及pwshoh-my-pwsh这些美化工具进行, 但是鉴于fish的开箱即用特点,我决定不使用美化工具,默认的就可以了。

由于fish不兼容bash的语法,因此通常不建议将其作为默认shell使用,而是在登陆后手动开启fish

1
fish

这样我们可以继续使用bash.bashrc进行环境变量等配置,fish也会自动继承相应的配置。 日常操作中最好也是继续使用bash脚本,通过shebang的方式指定使用bash

使用

fish默认支持实时更新的彩色显示,对于无效命令使用红色进行警告,有效命令则显示为蓝色,对于有效路径会显示下划线提示。 (这些默认行为都可以通过配置修改)

fish会自动给出命令提示,以灰色显示在光标之后,可以使用向右方向键自动补全,使用tab则会列出更多的候选项,命令提示会自动学习历史记录。

fish中对于含空格的参数,可以使用\转义或者使用单引号、双引号包裹。

1
2
3
mkdir My\ Files
cp ~/Some\ File 'My Files'
ls "My Files"

fish直接支持通配符,管道和输出重定向等操作,基本和bash相同。

还有很多使用细节,直接查看Fish 官方文档即可。

fish vs bash

下面是关于fishbash的一些常用语句的比较。

变量赋值:在bash中通过=对变量赋值:

1
x=10

fish中则通过set命令对变量赋值:

1
set x 10

设置全局环境变量:在bash中用export命令设置全局环境变量:

1
export PATH=$PATH:~/flutter/bin

fish 中,可以通过用 set -x 命令设置全局环境变量:

1
set -x PATH $PATH ~/flutter/bin

fish也提供了export命令,但是用法可能和bash不一样。

fish中,一个变量有多个值的时候,需要用空格隔开。(其实就是列表)

获取命令输出:在bash中获得一个命令输出的用法有两种

1
2
osType=$(uname -s)
osType=`uname -s`

fish中直接使用括号即可

1
set osType (uname -s)

别名:在bash中使用alias设置别名

1
alias rhino='java -jar ~/rhino-1.7.11.jar'

fish中使用 abbr -a 设置命令缩写

1
2
3
abbr -a <new> <old>

abbr -a rhino java -jar ~/rhino-1.7.11.jar

在执行命令时,缩写部分会被直接替换掉,并且替换是在命令行中通过自动补全的方式进行的,在历史记录中看到的都是替换后的命令。

也可以使用 alias 设置别名

1
alias rmi="rm -i"

但是需要注意的是:在fish中的别名实质上是自动创建了一个函数,例如上面的别名相当于

1
2
3
function rmi
command rm -i $argv
end

配置

fish中发挥类似.bashrc角色的文件是~/.config/fish/config.fish,其中的内容在fish启动时被执行。

如果觉得内容放在一个文件中比较复杂,可以将其拆分为若干个.fish文件,存放在~/.config/fish/conf.d/目录下, 这些文件的载入顺序在config.fish之前。

我们还可以定义专门的function,对函数文件要求以function名称作为文件名,加上后缀.fish,存放于~/.config/fish/functions/目录下,这些函数都会在fish启动时自动加载,载入顺序也在config.fish之前。 我们可以添加fish_greeting.fish文件,使用空函数代替默认的欢迎语

1
2
function fish_greeting
end

除此之外,fish还会把一部分配置变量保存到~/.config/fish/fish_variables 文件中,通常使用set -U或者浏览器设置的主题颜色等会保存在这里,例如set -U fish_greeting也可以达到关闭欢迎语的效果。

这里我们只关注了用户级的配置文件,实际上还有很多系统级配置文件。

补充

fisher也可以使用插件,这里首先下载插件管理器fisher,在fish中执行如下命令

1
curl -sL https://raw.githubusercontent.com/jorgebucaran/fisher/main/functions/fisher.fish | source && fisher install jorgebucaran/fisher

然后下载跳转插件z

1
fisher install jethrokuan/z