前往小程序,Get更优阅读体验!
立即前往
首页
学习
活动
专区
工具
TVP
发布
社区首页 >专栏 >为什么要用fish shell

为什么要用fish shell

原创
作者头像
mariolu
修改2020-02-20 01:50:19
2.3K0
修改2020-02-20 01:50:19
举报
文章被收录于专栏:CDN及云技术分享

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

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

1.1 单引号和双引号

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

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

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

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

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

图2、嵌套命令
图2、嵌套命令

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

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

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

图3、判断有效的重定向
图3、判断有效的重定向

1.4 And和or

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

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

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

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

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

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

1.6 $status替代$?

二、更强大的功能

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

2.4 abbr和alias

abbr比alias更强大。Alias就是创建一个func,如果要保存到config, 应该用funcsave

自定义的变量,所以如果有自定义,使用funcsave,他的效果是在这个function文件夹产生一个 文件名为命令.fish

图4、alias完再funcsave会产生一个函数目录下的.fish文件
图4、alias完再funcsave会产生一个函数目录下的.fish文件

2.5 自动补齐

Fish的autosuggestion包含了搜索命令历史、github分支、文件路径、shell变量名字、进程名字、job id(和job名字),(甚至可以用*?代替中间的不懂名字的目录)等。 比如/home/m*/(这里会列出所有m开头的子文件夹供选择)、波浪线~/。

常用的操作有:

  • 按右键或者CTRL+F接受建议
  • ALT+->接受建议的第一部分
  • TAB补全
  • 按tab召唤出提示窗口,可以方向键选择,如果光标在窗口内部,可以按住空格召唤search界面,如果不在窗口,按住任意键可以退出这个窗口(窗口内部鼠标移动到窗口外部需要按住esc键)

这个补齐是可以自定义的。定义自己的补齐

图5、自动补齐功能
图5、自动补齐功能

2.6 丰富的变量

  • %(进程名字),比如%nginx获取进程id
  • %last, 上一个进程的id
  • %(jobId)
图6 变量测试
图6 变量测试

2.7 丰富的执行返回码

$_ 当前命令,$status上一条命令执行的状态

  • 0:成功
  • 1:执行失败
  • 121:无效的输入参数
  • 123:参数字符串不对
  • 124:通配符没有匹配到任何东西
  • 125: 找到命令路径,但运行不了
  • 126: 找到命令路径,不是可执行文件
  • 127:找不到命令路径
  • 通过信号返回的以上的错误码+128

三、fish的设计原则

  • 多颜色的提示,颜色和文件夹字体(粗体)都更易于阅读。

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

颜色可配置有default、foregroud color

图7、fish的字体颜色
图7、fish的字体颜色
图8、带下划线说明文件路径有效
图8、带下划线说明文件路径有效
  • 自动补齐不止包括文件路径,还有变量名字,git分支,命令选项等
  • 没有subshell,所以对shell的改变对当前会话是可见的。(这个是bash一个大短板)
  • 每个命令都可以用tab提示。错误的命令能够被友好提示,并给出可能正确的建议
图9、错误命令友好的建议
图9、错误命令友好的建议

原创声明:本文系作者授权腾讯云开发者社区发表,未经许可,不得转载。

如有侵权,请联系 cloudcommunity@tencent.com 删除。

原创声明:本文系作者授权腾讯云开发者社区发表,未经许可,不得转载。

如有侵权,请联系 cloudcommunity@tencent.com 删除。

评论
登录后参与评论
0 条评论
热度
最新
推荐阅读
目录
  • 一、Fish跟默认的bash shell有什么不一样
    • 1.1 单引号和双引号
      • 1.2 命令的嵌套:小括号和$和重音符
        • 1.3 输出重定向和错误重定向,>和^
          • 1.4 And和or
            • 1.5、命令名字一样,但是功能更强大
              • 通配符:*,**,***
            • 1.6 $status替代$?
            • 二、更强大的功能
              • 2.1 改变当前工作路径
                • 2.2 增强版的命令history
                  • 2.3 Fish shell的debug
                    • 2.4 abbr和alias
                      • 2.5 自动补齐
                        • 2.6 丰富的变量
                          • 2.7 丰富的执行返回码
                          • 三、fish的设计原则
                          领券
                          问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档