>

一、介绍

Fish 是目前所有 shell (bash, zsh, tsh, etc)中我个人认为用得最顺手、最快捷的 shell 了,本文介绍 fish 的安装、配置以及使用。

官方资源

github: https://github.com/fish-shell/fish-shell
official: http://fishshell.com/docs/current/index.html
faq: https://fishshell.com/docs/current/faq.html

二、安装

使用包管理器安装

(1)Ubuntu
先添加源:执行apt-add-repository ppa:fish-shell/release-2 或者 $ apt-add-repository ppa:fish-shell/nightly-master
安装

$ apt-get update
$ apt-get install fish

(2)Arch Linux

$ pacman -S fish

(3) CentOS

$ yum install fish
源码安装

源码地址:https://github.com/fish-shell/fish-shell
先使用 git clone 下载,然后安装下列依赖 dependencies:

libncurses5, gettext, autoconf

确保上述依赖已经安装之后,执行下列命令进行编译及安装:

1
2
3
4
$ autoconf                                          # if building from Git
$ ./configure --prefix=/usr
$ make                                              # use gmake on BSD
$ sudo make install

在 /etc/shells 中添加 fish

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

把 fish 设置为默认 shell

$ chsh -s /usr/bin/fish

禁用 fish shell 启动时的欢迎语

$ set fish_greeting

三、配置 fish

默认情况下,所有 fish 相关的文件会被安装在 /usr/local/share, /usr/local/etc/usr/local/fish 目录中,fish 可执行程序本身则会被安装在 /usr/local/bin 中。

fish 提供了一个配置文件样例 share/fish/config.fish,用户的 fish 配置文件应该放在 ~/.config/fish/ 目录下,所以,在安装完 fish 之后,通常我们需要这样:

$ cp share/fish/config.fish ~/.config/fish/config.fish

然后,根据需要来个性化设置 config.fish。

fish 的 prompt, 在 functions 目录加入文件 fish_prompt.fish ,其内容为:

1
2
3
4
5
6
7
8
9
10
11
12
13
# 其中的 (hostname) (prompt_pwd) 为shell命令, $USER 为环境变量, __fish_prompt_hostname 为临时变量
function fish_prompt
if not set -q __fish_prompt_hostname
set -g __fish_prompt_hostname (hostname)
end
set_color -o cyan
echo -n -s "$USER" @ "$__fish_prompt_hostname" ": "
set_color -o green
echo -n (prompt_pwd)
# 也可以用这个: echo -n ' $ '
echo -n " \$ "
set_color normal
end
fish 配置文件简单样例:
1
2
3
4
5
6
7
8
9
source $HOME/.fishmarks/marks.fish
set -gx GOROOT '/usr/local/go'
set -gx GOPATH '/home/juniway/go'
set -g -x PATH {$GOROOT}/bin {$GOPATH}/bin $PATH

# alias
alias g11 'g++ -std=c++14 -Wall -O0 -pedantic'
alias cl++ 'clang++ -std=c++11 -Wall -O0 -pedantic'
alias tmux 'tmux -2'

四、使用 fish

fish 的使用非常简单,而且提供了一些快捷键加快命令的输入,跟使用 bash 一样,TAB 键用来做命令补全,但是跟 bash 下相比有改进,如果输入的不匹配任何补全字符串,那么会显示红色。另外,不断重复的按 TAB 会循环所有可能的补全。

在输入命令的参数时,TAB 还可以显示不同的选项,比如:
输入 ./configure -- 然后按 TAB,会显示所有 – 后面的选项

在 fish 列出候选的补全命令之后,按 Ctrl + F 或者 右方向键 可以完成补全。

在 fish 下,ls 命令集成了 find 功能,是一个递归搜索神器。

五、fish 与 bash 的差异

(1)fish 中,如果有一个软链指向的是一个目录, 那么需要 ls qa/ 这样才能列出目录中的内容。
(2)fish 不支持 bash 下的 !!, !, $?
(3)fish 不支持 ctrl + r 历史命令,但是只需要键入想搜索的历史命令中的某些字母,再按 ctrl + p 或者 ctrl + n 就能不断前后翻找历史命令。
(4)fish 不在支持命令之间用 &&, ||, ! 来连接,取而代之的是 and, or, not,
例如:

$ mkdir ~/test; and echo "OK"; or echo "Failed"

(5)fish 中通过 set 来代替 “=” 对变量赋值,如下

$ set name Justin

如果需要擦除变量,就执行 set -e

(6)fish 中没有 export 命令,需要用 set -x 来代替。
(7)命令替换,比如用一个变量来保存某个命令的执行结果,只需把命令放在括号里即可,比如:

$ set os (uname -a)

fish 跟 bash 一样使用分号 ; 来使多个命令顺序执行。

六、fish shell 可能会导致的问题

(1) make 命令假死
传统的项目编译构建通常会使用 configure 以及 make,由于 configure 在检查系统的时候会生成 Makefile,默认的是使用 /bin/sh 作为 shell ,
因此如果在 fish shell 下面执行 ./configure,其产生的临时文件 conftest.make 会导致 make 命令假死。

解决方案是把 shell 切换回 bash(执行 chsh -s /bin/bash),重新登录之后再执行 ./configure 就没有问题了。

(2)fish 会使得 vim 的 plugin 安装失败
在 ~/.vimrc 中添加下面这行即可解决

set shell=/bin/bash

相关资源:
https://github.com/jbucaran/fish-shell-cookbook


如果你对我的文章感兴趣,欢迎留言或者关注我的专栏。

微信公众号:“知辉”

搜索“deliverit”或

扫描二维码