是什么 ? | : | Friendly Interactive SHell |
开发语言 | : | C++ |
官方主页 | : | http://fishshell.com |
源码仓库 | : | https://github.com/fish-shell/fish-shell |
注意:fish
是一个现代的Shell, 它故意不支持POSIX Shell的语法,主要是因为POSIX Shell
是上世纪七八十年代的产物,它的很多语法比较怪异,fish
想要摆脱这种怪异的语法,所以它故意不兼容POSIX Shell。但是, 也正是因为他不兼容POSIX Shell,它注定是小众。因为这种不兼容对于操作系统在切换默认Shell的时候就会PASS
掉它。比如,macOS 10.15开始将默认Shell从bash切换为zsh,为啥极其注重用户友好的Apple
没有选择将fish
作为它的默认Shell呢?这就是因为fish
不兼容bash,而zsh兼容bash, 默认Shell从bash切换为zsh之后, 不会对用户造成坏的影响。
你可能会想:fish
就不能兼容bash吗?其实是可以的,但是性能会降低,所以为了性能, 他们没有这么做。这就像当Linus Torvalds
开发Linux的时候, 选择宏内核
架构而不是微内核
架构, 尽管学术界在当时已经肯定了微内核
是比宏内核
更先进的架构,但是,那也仅仅是在学术理论上的讨论中, 现实中并没有成功的案例。就连这么牛的人都觉得微内核
是幻想。它更务实选择了宏内核
。
fish
就像宏内核
,很多功能它都自己实现了,你基本不需要配置就获得了很多的特性, 而其他的Shell也能获得这些功能,但是你需要安装很多的插件、做很多的配置才能拥有这些特性。
操作系统 | 包管理器 | 仓库 | 安装命令 |
---|---|---|---|
macOS | HomeBrew | official | brew install fish |
GNU/Linux | HomeBrew | official | brew install fish |
apt | official | sudo apt-get install -y fish | |
CentOS | yum | EPEL | sudo yum install -y epel-release |
dnf | official | sudo dnf install -y fish | |
openSUSE | zypper | official | sudo zypper install -y fish |
Alpine Linux | apk | official | sudo apk add fish |
pacman | official | sudo pacman -Syyu --noconfirm | |
Gentoo Linux | Portage | official | sudo emerge fish |
注意:请不要将fish
作为您的login shell
。 但是,您可以将您的non-login shell
切换为fish
。 一般的操作系统的默认non-login shell都不是fish
, 而且Terminal都有选择使用哪个non-login shell
的设置选项。 您可以根据自己使用的Terminal进行配置。
级别 | 配置文件路径 |
---|---|
系统级 | /etc/fish/config.fish |
用户级 | ~/.config/fish/config.fish |
fish
的配置可以通过Oh My fish来管理。
fish
还提供了一个Web
配置界面。通过fish_config
启动。
bash
通过=
对变量赋值:
x=10
fish
通过set
命令对变量赋值:
set x 10
bash
里,用export
命令设置全局环境变量:
export PATH=$PATH:~/flutter/bin
fish
里,用set -x
设置全局环境变量:
set -x PATH $PATH ~/flutter/bin
在fish
里,一个变量有多个值的时候,用空格
隔开,我们知道,这其实就是列表
。
在bash
里,获得一个命令的输出的时候,用$(command)
或者`command`
:
osType=$(uname -s)
osType=`uname -s`
在fish
里,是(command)
这种形式:
set osType (uname -s)
在bash
里,alias
:
alias rhino='java -jar ~/rhino-1.7.11.jar'
在fish
里,abbr -a
:
abbr -a rhino java -jar ~/rhino-1.7.11.jar
格式为:abbr -a <new> <old>
上面提到的4
点是我们最常用的,实际上,fish
的大多数语法都与bash不兼容,在日常办公环境中使用还是可以的,但是用作服务器环境是不可取的。