为什么要用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
