• Linux Shell用于与内核通信。
  • 大多数发行版的默认Shell是Bash。
  • 还有一种更友好的选择,叫做Fish。

本质上,Linux Shell解释命令,使内核能够理解并执行它们。没有Shell,命令根本无法运行,应用程序也无法工作。

因此,Shell非常重要。

大多数Linux发行版默认使用Bash(Bourne Again Shell)。之所以叫 “Bourne”,是因为Bourne Shell是最早的Shell,Bash是对其的改进。使用Bash,你可以编写几乎可以完成任何任务的脚本。不过,Bash已经存在很久,基本没有太大变化。

好消息是还有替代方案,其中一种在Bash忽视的功能上做了增强。该Shell叫做Fish(Friendly Interactive SHell)。Bash给人的感觉是为你工作,而Fish则是与你协作。

这乍听可能有点抽象,下面解释一下。

在Bash中运行命令时,你输入后回车,等待结果。Bash不会提供帮助,只是接受命令并尝试执行。

Fish的行为略有不同。当你在Fish中开始输入命令时,它会根据历史记录提供建议。看到合适的建议后,按右方向键接受。例如,你输入ssh,Fish会提示ssh 192.168.1.26,按方向键确认后再回车。

你还会注意到Fish使用颜色提示。比如输入无效命令时会显示为红色;将其改正后会变为蓝色。

当你键入文件路径时,路径无效时显示红色,合法后变为蓝色。

输入命令时,按Tab键会弹出多个建议。可以使用方向键在列表中滚动并选择想要的命令。

在Fish中可以使用set命令设置变量。例如,要把变量name设置为自己的名字,可以输入

set name jack

随后可以这样使用该变量

echo "My name is $name"

输出将是

My name is jack

Fish在其他方面也更友好。例如,在Bash中使用反引号 (`) 包裹命令,常常让人困惑;而在Fish中使用圆括号

echo (whoami) in (pwd)

上述命令的结果类似

jack in/home/jack

你还可以为命令设置缩写(相当于Bash的别名)。比如经常使用git checkout,想把它缩写为gco,可以这样

abbr --add gco git checkout

同样可以为多个SSH目标设置缩写

abbr --add ssh11 "ssh 192.168.1.11" abbr --add ssh12 "ssh 192.168.1.12"

此后输入ssh11会自动连接到192.168.1.11ssh12则连接到192.168.1.12

这些缩写在注销后仍然保留。

Fish还内置了计算器。例如

math 5020/220

会在提示符直接显示答案22.818182

Fish可以通过各发行版的标准软件源安装。例如,在Ubuntu上

sudo apt-get install fish -y

在Fedora上

sudo dnf install fish -y

在Arch上

sudo pacman -S fish

安装后,需要使用以下命令将其设为默认Shell

chsh -s $(which fish)

如果不喜欢Fish(你最终会发现),可以切回Bash

chsh -s $(which bash)

这就是Fish Shell。记住,教会别人使用Fish,就是为他们的终身生产力加分。