命令行是程序员的必备技能。图形界面虽然好看,解决问题还是要靠命令行。
命令行由 Shell 提供。各种命令通过 Shell,传递给操作系统的内核。学习命令行就是在学习 Shell。

Shell 有好几种,目前最常用是 Bash 和 zsh。但是,在我看来,它们都不如 Fish Shell 好用。
五年前,我第一次尝试 Fish,感到很惊艳,一直用到现在。本文介绍 Fish 的主要特点,希望你也来尝试它。

感谢优达学城对本文提供赞助,结尾处有他们的课程推荐。
一、简介
Fish 是"the friendly interactive shell"的简称,最大特点就是方便易用。很多其他 Shell 需要配置才有的功能,Fish 默认提供,不需要任何配置。
如果你想拥有一个方便好用的 Shell,又不想学习一大堆语法,或者花费很多时间配置,那么你一定要尝试一下 Fish。

二、安装
Ubuntu 和 Debian 的安装方法。
$ sudo apt-get install fish
Mac 的安装方法。
$ brew install fish
其他系统的安装请参考官方网站。
三、启动与帮助
安装完成后,就可以启动 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 进行配置,比如选择提示符和配色主题。

(正文完)
下面是推广时间。
最近,Angela Zhu 在她的公众号发文《怎样让自己成为不可替代的程序员?》。
"前些日子,突发奇想,在我的小密圈里提了这样一个问题:'未来,什么样的程序员才是不可替代的?'"
曹政回复了一篇《当我们追求不可替代......》。
"从我的历史来说,我一直追寻的是让自己可替代,不论是去尽可能培养年轻的接班人,还是外部延聘比我更出色的技术高手。如果没有人可以接手我的系统,我设计的平台,我才会觉得紧张和不安。"
这个讨论涉及了很多问题。
- 个人如何保持竞争力
- 公司如何选人
- 如何留住人才
这些问题没有标准答案。但是,有一点是肯定的:程序员必须勇于尝试、开拓和创新,在挑战和失败面前不放弃。
优达学城帮助你形成自己的竞争力。
《机器学习(纳米学位)》课程的报名本周四(5月4日)截止,主讲人是大名鼎鼎的 Sebastian Thrun,他是谷歌无人驾驶汽车项目的奠基人。感兴趣的朋友不要错过,如果试听不满意,一周内全额退款。
优达学城还有一门《机器学习入门课程》,重点讲授编程基础和数学基础(线性代数、微积分和统计学),适合不知道如何入门的年轻朋友。
另外,还有《无人驾驶汽车》、《人工智能》、《机器人工程师》等课程,大家也可以关注。
(完)



Colin 说:
最开始用了几年bash,近两年用的zsh,好吧,在试用 fish 了,不错 :)
2017年5月 2日 09:41 | # | 引用
老顽童 说:
尝试使用中, 不过每次都要fish 一下,挺不方便的。
2017年5月 2日 09:50 | # | 引用
sense 说:
用过一段时间fish,确实好用。但是各种不兼容性不可忽视。在配置一些东西的时候,大部分发布者默认的环境是bash和zsh。仔细研究的话也能解决,可是太耗精力了,碰壁多了就切回bash了。遵循标准可以减少很多无谓的精力浪费,如果兴趣爱好在这可以忽略。
2017年5月 2日 10:53 | # | 引用
lemon0910 说:
与bash语法不兼容感觉是硬伤,还有这个支持插件吗
2017年5月 2日 11:19 | # | 引用
jone 说:
感觉系统开发才会用到shell
2017年5月 2日 11:39 | # | 引用
xinyifly 说:
这次我用的是 Emacs Shell :)
2017年5月 2日 14:47 | # | 引用
Sidfate 说:
看起来很好用的样子,前面几位说的兼容性的问题大吗?
2017年5月 2日 15:24 | # | 引用
JayXon 说:
不兼容bash就是在给自己找事,其实文中说的一到六全部可以在zsh上实现
2017年5月 2日 15:31 | # | 引用
Any difference to use command 说:
In the function example, there is one `ls` and one `ll`.
One has prefix `command`, another not.
Any difference?
Thanks.
2017年5月 3日 09:32 | # | 引用
bingo 说:
你可以使用chsh /usr/bin/fish改变默认shell。通过 cat /etc/shells 可以查看当前系统已经安装的shell
2017年5月 3日 16:02 | # | 引用
向上的丁子 说:
想问下您这是什么评论系统?我想在自己的站点也用一个 :)d
2017年5月 3日 17:44 | # | 引用
zhangnew 说:
昨天发布的文章今天就到了 Google 首页,学习了
2017年5月 3日 18:17 | # | 引用
tanchao90 说:
这种不兼容bash的还是算了:
1、得上手学习心得东西,成本高;
2、不是每个工作环境都有人配置好了fish;
3、自己写的脚本要具有通用性;
2017年5月 3日 21:52 | # | 引用
Guest 说:
可以用:
https://github.com/edc/bass
兼容 bash
2017年5月 4日 12:15 | # | 引用
jony 说:
你的博客是怎么搭建的,我也想做个个人博客
2017年5月 4日 16:52 | # | 引用
但丁 说:
本来还饶有兴致的准备尝试一下,看到不兼容bash就算了
2017年5月 4日 19:35 | # | 引用
钊王 说:
刚接触mac时对了几个,总体感觉oh-my-zsh是相对好用的,您上面说的几个功能这里都有
2017年5月 5日 10:55 | # | 引用
钛客志 说:
想要入手shell,看到评论的评友推荐一下怎样快速入门
2017年5月 5日 23:46 | # | 引用
D.Zet 说:
@jony
workpress.com 可搭建个人博客。看你选择哪种类型了
win系统我用的是choco,软件自动化管理
2017年5月 9日 03:18 | # | 引用
读心 说:
workpress.com 可搭建个人博客。看你选择哪种类型了
@D.Zet workpress.com是个培训网站啊win系统我用的是choco,软件自动化管理
2017年5月11日 16:58 | # | 引用
ilangge 说:
用Zsh的时候,觉得最有用的就是auto jump插件,输入j + 不完整路径,直接跳转到曾经去过的路径。非常方便在不同的项目目录间跳转。
fish我还没看到有什么插件。
2017年5月15日 11:58 | # | 引用
wz 说:
赞,目前用的是zsh,准备切换到fish
2017年5月16日 17:39 | # | 引用
netwjx 说:
fish最大的问题是, 我还是需要写bash shell的脚本, 因为它的兼容性更好.
而正好fish的不少语法和bash不怎么兼容.
后半部分的狗粮不错
2017年5月19日 14:46 | # | 引用
Guest 说:
@ilangge
fish 有 z 可用:
https://github.com/fisherman/z
2017年5月26日 12:23 | # | 引用
Sam 说:
虽然不错,但是不太通用吧?
2017年6月10日 16:24 | # | 引用
zuijiawoniu 说:
&&符号不能用,得替换为分号;,请问有解决方案吗?
2017年7月 3日 16:51 | # | 引用
ming 说:
还好吧,感觉菜鸟级别的程序员不适合这么折腾。
2017年9月12日 20:20 | # | 引用
ice 说:
autojump也可以在fish 中使用,重新克隆安装一些就行
2018年6月 8日 14:18 | # | 引用
紫玄 说:
两个项目,一个十几k,一个九十几k的star,我觉得差别这么大的一个原因,可能就是fish不支持bash,毕竟bash才是linux最广泛支持的
2019年6月29日 12:25 | # | 引用
running-grass 说:
学习了,但是感觉oh my zsh也不错,fish可以拿来玩玩,还是zsh当主力吧
2020年10月31日 17:43 | # | 引用
Jerry 说:
用下来还挺好的
2021年3月14日 11:52 | # | 引用
D 说:
请问fish如何source sh文件呢,能和bash一样source .bash或是source .zsh呢
2025年11月13日 11:27 | # | 引用