一、介绍
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
确保上述依赖已经安装之后,执行下列命令进行编译及安装:
$ 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 ,其内容为:
# 其中的 (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 配置文件简单样例:
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