为什么要用fish shell

  • 2020 年 2 月 20 日
  • 筆記

一、Fish跟默认的bash shell有什么不一样

什么是fish,Fish又称为Friendly shell for interactive use。Fish设计之初能兼容其他shell的命令, 并且会比其他shell更友好而且又高效。在一些特性上,fish做了改进,这和其他shell比如bashl是有区别的。体现在一些标识符,一些命令扩展和易用上。

1.1 单引号和双引号

fish这里对待单引号和双引号的方式和bash不太一样。fish对待两种引号区别:能不能进一步展开$变量。双引号可以,单引号不可以。

图一、单引号和双引号的区别

另一这里其实还有个大括号,{$PATH}xxx,这里$PATH是个列表变量,他和xxx形成笛卡尔积,也就是展开成[PATH1xxx,PATH2xxx,…,PATHnXXX]

1.2 命令的嵌套:小括号和$和重音符

fish的小括号的含义如同重音符。比如

图二、嵌套命令

1.3 输出重定向和错误重定向,>和^

这里的^file是写错误输出到目标文件,^^file是追加错误到目标文件。错误重定向这个跟版本有关系,在fish2是有这个功能。Bash是2>, fish也可以使用^,但是在新版本fish已经遗弃了

另外在file前追加?代表操作之前先判断该文件存不存在。

图三、判断有效的重定向

1.4 And和or

And和or相当于bash的&&和||。

用法是command1; and command2 这里有个分号。

这个和command1;command2不一样,这里command2无论command1是否成功都会被执行到。或者这里分号可以用回车符替代

1.5、命令名字一样,但是功能更强大

通配符:*,**,***

  • 扩展了*号,有两个**。比如以下例子:
  • ? 一个字符
  • ???名字3个字符
  • *任意字符串但不包含/
  • **任意字符串包含/,可以包含子文件夹,但是好像是文件名不能带有/(这个对吗)
  • ***包含子文件夹,包含名字,不受任何限制

二、更强大的功能

2.1 改变当前工作路径

除了常规的Cd、pwd(print working dir),fish还扩展了以下关于工作路径相关的命令:

. / ~都不是一个有效的字符,所以在命令中都可以看做特殊符号来对待

  • Dirh:打印曾经访问过的目录路径。Dir history
  • Cdh 的fish2.7版本好像不存在
  • Prevd:目录后退
  • Nextd:目录前进
  • Pushd和popd +-1
  • Dirs.当前push和pop操作的dir stack

2.2 增强版的命令history

所有会话的命令保存在 ~/.local/share/fish/fish_history。不保存空格开头的隐形命令。不保存重复的命令。只留下最近的命令。fish_history文件保存了命令和执行时间。

  • 命令保存在内存中,之后才保存在硬盘fish_history文件,一个会话不能看到另一个没关闭会话的命令,需要手动执行history merge(这个试了没用,可能跟fish版本支不支持有关系)
  • History 模糊字符串
  • History -t显示时间,需要fish 3
  • History -n 最大数量,需要fish 3
  • History clear清除命令

2.3 Fish shell的debug

Bash -x script

Fish -d 3 script.fish

正常的debug一般用echo,但是fish有更强大的debug指令breakpoint

三、fish的设计原则

颜色和文件夹字体都更易于阅读

默认起始颜色都是红色的,直到遇到正确的文词才会变成蓝色

颜色可配置有default、foregroud color

图四、fish的字体颜色