命令行是程序员的必备技能。图形界面虽然好看,解决问题还是要靠命令行。
命令行由 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 | # | 引用