## Fish shell 入门教程
##### 原文链接:http://www.ruanyifeng.com/blog/2017/05/fish_shell.html
命令行是程序员的必备技能。图形界面虽然好看,解决问题还是要靠命令行。
命令行由 Shell 提供。各种命令通过 Shell,传递给操作系统的内核。学习命令行就是在学习 Shell。
Shell 有好几种,目前最常用是 Bash 和 zsh。但是,在我看来,它们都不如 Fish Shell 好用。
### 一、简介
* * * * *
Fish 是"the friendly interactive shell"的简称,最大特点就是方便易用。很多其他 Shell 需要配置才有的功能,Fish 默认提供,不需要任何配置。
如果你想拥有一个方便好用的 Shell,又不想学习一大堆语法,或者花费很多时间配置,那么你一定要尝试一下 Fish。
## 二、安装
Ubuntu 和 Debian 的安装方法。
> ~~~
>
> $ sudo apt-get install fish
>
> ~~~
Mac 的安装方法。
> ~~~
>
> $ brew install fish
>
> ~~~
其他系统的安装请参考[官方网站](http://fishshell.com/#platform_tabs)。
## 三、启动与帮助
安装完成后,就可以启动 Fish。
> ~~~
>
> $ fish
>
> ~~~
由于 Fish 的语法与 Bash 有很大差异,Bash 脚本一般不兼容。因此,我建议不要将 Fish 设为默认 Shell,而是每次手动启动它。
使用过程中,如果需要帮助,可以输入`help`命令。浏览器就会自动打开,显示在线文档。
> ~~~
>
> $ help
>
> ~~~
## 四、彩色显示
进入 Fish 以后,你注意到的第一件事,可能就是它默认彩色显示。
> ~~~
>
> # 无效命令为红色
> $ mkd
>
> # 有效命令为蓝色
> $ mkdir
>
> ~~~
有效路径会有下划线。
> ~~~
>
> $ cat ~/somefi
>
> ~~~
上面代码表示,存在以`~/somefi`开头的路径。如果没有下划线,你就知道这个路径不存在。
## 五、自动建议
Fish 会自动在光标后面给出建议,表示可能的选项,颜色为灰色。
> ~~~
>
> # 命令建议
> $ /bin/hostname
>
> # 参数建议
> $ grep --ignore-case
>
> # 路径建议
> $ ls node_modules
>
> ~~~
如果采纳建议,可以按下`→`或`Control + F`。如果只采纳一部分,可以按下`Alt + →`。
## 六、自动补全
输入命令时,Fish 会自动显示匹配的上一条历史记录。
> ~~~
>
> $ git commit -m "feat: first commit"
>
> ~~~
如果没有匹配的历史记录,Fish 会猜测可能的结果,自动补全各种输入。比如,输入`pyt`再按下`Tab`,就会自动补全为`python`命令。
如果有多个可能的结果,Fish 会把它们都列出,还带有简要介绍。
> ~~~
>
> $ vi[按下 Tab 键]
>
> vi (Executable link, 2.7MB)
> view (Vi IMproved, 一个程序员的文本编辑器)
> viewer.py (Executable, 967B)
> viewres (Graphical class browser for Xt)
> ...and 12 more rows
>
> ~~~
这时,再按一次`tab`,就可以在这些命令之中选择。
除了补全命令,Fish 还可以补全参数。比如,`ls`命令的`-l`参数后面按下`Tab`键,就会显示可以连用的其他参数。
> ~~~
>
> $ ls -l[按下 Tab 键]
>
> -l1 (List one file per line)
> -lA (Show hidden except . and ..)
> -la (Show hidden)
> -lB (Ignore files ending with ~)
> ...and 16 more rows```
>
> ~~~
Fish 还可以自动补全 Git 分支。
> ~~~
>
> $ git checkout master
>
> ~~~
## 七、易懂的语法
Fish 的语法非常自然,一眼就能看懂。
`if`语句。
> ~~~
>
> if grep fish /etc/shells
> echo Found fish
> else if grep bash /etc/shells
> echo Found bash
> else
> echo Got nothing
> end
>
> ~~~
`switch`语句。
> ~~~
>
> switch (uname)
> case Linux
> echo Hi Tux!
> case Darwin
> echo Hi Hexley!
> case FreeBSD NetBSD DragonFly
> echo Hi Beastie!
> case '*'
> echo Hi, stranger!
> end
>
> ~~~
`while`循环。
> ~~~
>
> while true
> echo "Loop forever"
> end
>
> ~~~
`for`循环。
> ~~~
>
> for file in *.txt
> cp $file $file.bak
> end
>
> ~~~
## 八、函数
Fish 的函数用来封装命令,或者为现有的命令起别名。
> ~~~
>
> function ll
> ls -lhG $argv
> end
>
> ~~~
上面代码定义了一个`ll`函数。命令行执行这个函数以后,就可以用`ll`命令替代`ls -lhG`。其中,变量`$argv`表示函数的参数。
下面是另一个例子。
> ~~~
>
> function ls
> command ls -hG $argv
> end
>
> ~~~
上面的代码重新定义`ls`命令。注意,函数体内的`ls`之前,要加上`command`,否则会因为无限循环而报错。
## 九、提示符
`fish_prompt`函数用于定义命令行提示符(prompt)。
> ~~~
>
> function fish_prompt
> set_color purple
> date "+%m/%d/%y"
> set_color FF0
> echo (pwd) '>'
> set_color normal
> end
>
> ~~~
执行上面的函数以后,你的命令行提示符就会变成下面这样。
> ~~~
>
> 02/06/13
> /home/tutorial >
>
> ~~~
## 十、配置
Fish 的配置文件是`~/.config/fish/config.fish`,每次 Fish 启动,就会自动加载这个文件。
我们可以在这个文件里面写入各种自定义函数,它们会被自动加载。比如,上面的`fish_prompt`函数就可以写在这个文件里面,这样每次启动 Fish,就会出现自定义的提示符。
Fish 还提供 Web 界面配置该文件。
> ~~~
>
> $ fish_config
>
> ~~~
输入上面的命令以后,浏览器就会自动打开本机的 8000 端口,用户可以在网页上对 Fish 进行配置,比如选择提示符和配色主题。
![](http://www.ruanyifeng.com/blogimg/asset/2017/bg2017050203.png)
(正文完)