fish
1.0、参考
1.1、fish简介
是什么 ?: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开始将默认Shellbash切换为zsh,为啥极其注重用户友好的Apple没有选择将fish作为它的默认Shell呢?这就是因为fish不兼容bash,而zsh兼容bash, 默认Shellbash切换为zsh之后, 不会对用户造成坏的影响。

你可能会想:fish就不能兼容bash吗?其实是可以的,但是性能会降低,所以为了性能, 他们没有这么做。这就像当Linus Torvalds开发Linux的时候, 选择宏内核架构而不是微内核架构, 尽管学术界在当时已经肯定了微内核是比宏内核更先进的架构,但是,那也仅仅是在学术理论上的讨论中, 现实中并没有成功的案例。就连这么牛的人都觉得微内核是幻想。它更务实选择了宏内核

fish就像宏内核,很多功能它都自己实现了,你基本不需要配置就获得了很多的特性, 而其他的Shell也能获得这些功能,但是你需要安装很多的插件、做很多的配置才能拥有这些特性。

1.2、通过包管理器安装fish
操作系统包管理器仓库安装命令
macOSHomeBrewofficialbrew install fish
GNU/LinuxLinuxBrewofficialbrew install fish
aptofficialsudo apt-get install -y fish
CentOSyumEPELsudo yum install -y epel-release
sudo yum install -y fish
dnfofficialsudo dnf install -y fish
openSUSEzypperofficialsudo zypper install -y fish
Alpine Linuxapkofficialsudo apk add fish

Arch Linux

ArcoLinux

Manjaro Linux

pacmanofficialsudo pacman -Syyu --noconfirm
sudo pacman -S    --noconfirm fish
Gentoo LinuxPortageofficialsudo emerge fish
1.3、通过源码安装fish

step1、安装依赖

下载时cURL
解压时targzip
编译时POSIX shGNU CoreUtilsmakeGCC ( gccg++ )   | LLVM / Clang
运行时
  • glibc ( libc.solibm.solibdl.solibpthread.sold-linux-x86-64.so )
  • GCC ( libstdc++.solibgcc_s.so )
  • pcre2 ( libpcre2-32.so )
  • ncurses ( libtinfo.so )

step2、使用curl命令下载fish源码包 (

curl -LO https://github.com/fish-shell/fish-shell/releases/download/3.0.2/fish-3.0.2.tar.gz

step3、使用tar解压fish源码包

tar vxf fish-3.0.2.tar.gz

step4、进入fish-3.0.2目录,并查看它的内容

step5、配置、编译、安装

./configure && make && sudo make install
1.4、切换到fish

注意:请不要将fish作为您的login shell。 但是,您可以将您的non-login shell切换为fish。 一般的操作系统的默认non-login shell都不是fish, 而且Terminal都有选择使用哪个non-login shell的设置选项。 您可以根据自己使用的Terminal进行配置。

1.5、配置fish
级别配置文件路径
系统级/etc/fish/config.fish
用户级~/.config/fish/config.fish

fish的配置可以通过Oh My fish来管理。

fish还提供了一个Web配置界面。通过fish_config启动。

1.6、从bashzsh切换到fish的注意点
1.6.1、赋值

bash通过=对变量赋值:

x=10

fish通过set命令对变量赋值:

set x 10
1.6.2、export

bash里,用export命令设置全局环境变量:

export PATH=$PATH:~/flutter/bin

fish里,用set -x设置全局环境变量:

set -x PATH $PATH ~/flutter/bin

fish里,一个变量有多个值的时候,用空格隔开,我们知道,这其实就是列表

1.6.3、用()代替$()和``

bash里,获得一个命令的输出的时候,用$(command)或者`command`

osType=$(uname -s)
osType=`uname -s`

fish里,是(command)这种形式:

set osType (uname -s)
1.6.4、用abbr -a代替alias

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>

1.6.5、其他

上面提到的4点是我们最常用的,实际上,fish的大多数语法都与bash不兼容,在日常办公环境中使用还是可以的,但是用作服务器环境是不可取的。