Fish Shell 的使用特性和优势

引言

当提到命令行界面(CLI)时, 我们通常会想到一种强大而高效的方式来与计算机进行交互。在众多的 Shell 中最常用的就数 Bash 和 zsh 了,除此之外还有一颗闪耀的明星 Fish Shell,它以其现代化的设计和强大的特性而备受赞誉,成为许多开发人员和系统管理员钟爱的选择,正如官网宣传的 Finally, a command line shell for the 90s,  翻译过来就是 Fish Shell 是一个为 90 后准备的 Shell,它主要特性如下:

  • 安装时就默认集成了很多需要的功能,无法进行大量配置

  • 命令行语法高亮,错误会显示红色

  • 智能提示

  • 可视化配置: 可以使用 Web 网页的进行终端配置

在这篇文章中,我们将简单介绍下 Fish Shell 的各种特性和优势,并带您了解如何开始使用和定制这个强大的 Shell。无论您是一名新手还是有经验的用户,都将发现 Fish Shell 为命令行界面带来的愉悦和效率提升。准备好探索 Fish Shell 的奇妙世界了吗? 让我们一起开始这个令人兴奋的旅程!

一、安装

在开始前我们需要先安装下 fish,因为我这边是 Mac 系统,下面 👇🏻 也将只介绍 Mac 下安装方式,更多系统对应安装方法可参考官方文档。

 
brew install fish

上图中框出的部分是 fish 的安装路径, 这里最好简单记下, 后面需要用到

二、切换

2.1 手动切换

默认情况下命令行终端使用的 Shell 是 Bash 或者 zsh, 这里我们需要通过 fish 命令切换到 Fish Shell

 
fish

这里如果需要退出 Fish Shell 可执行 exit 命令进行退出

exit

图片

2.2 设置为默认 Shell

如果您希望使用 Fish Shell 作为默认的 shell,可使用以下命令:

在开始之前我们需要先确认下 fish 的安装路径,在安装 fish 时输出日志中会给出对应的安装地址。

图片

下面我们需要在 /etc/shells 中追加 fish 的 脚本 路径,否则在切换默认 Shell 时会报 non-standard shell 错误,脚本路径为: {fish 安装路径}/bin/fish

sudo vim /etc/shells

图片

下面我们通过 chsh -s 来切换默认 Shell

chsh -s /opt/homebrew/Cellar/fish/3.6.1/bin/fish

图片

切换完后, 我们重新开一个终端将默认使用 Fish Shell

图片

如果需要切换回去, 只需需要执行 chsh -s /bin/zsh 或 chsh -s /bin/bash 即可

chsh -s /bin/zsh

最后补充: 由于 Fish Shell 的语法与 Bash 有很大差异,对 Bash 脚本可能会出现不兼容,因此建议不要将 Fish Shell 设为默认 Shell,而是每次手动启动它。

三、好用特性介绍

3.1 命令行语法高亮

Fish Shell 在我们输入命令时就会对语法进行高亮, 这里最重要的要数 潜在错误 的检测, 也就是在输入命令且未执行前,就可以提前对输入的内容进行检测, 并对检测结果进行高亮,相关高亮逻辑有:

1、有效命令默认高亮为蓝色

图片

2、无效命令默认高亮为红色

图片

3、对于有效路径会有下划线提示

图片

4、不匹配的括号或者逗号

图片

3.2 自动补全建议

Fish Shell 自带 命令补全建议 功能, 当我们输入命令后, 我们将在光标后看到以柔和的灰色显示的推荐内容,这些内容可能是 Fish Shell 推导出来的, 也有可能是历史使用过的命令

图片

如果要采纳建议, 可以按下 ->

图片

如果只采纳一部分, 可以按下 Alt + ->

图片

3.3 Tab 选项

如果我们需要想查看给定命令是否还有其他可能性, 那么在输入几个字母后, 只需按一下 Tab 键即可

1、如下是输入完 git 直接按 Tab 的结果,它直接列出了所有可能命令以及描述

图片

2、这里是输入 git 以及空格后按下 Tab 的结果, 它将给出 git 的所有可能命令以及描述

图片

3、当然除了补全命令, 它还可以补全参数, 如下是输入 - 后按下 Tab 的结果,它将给出 git commit 的所有可能参数以及描述

图片

3.4 基于 Web 的配置器

Fish Shell 相对于其他 Shell 有一个比较有意思的功能, 就是可以通过浏览器来配置或查看 Shell 的主题、提示、功能函数、常量、历史记录、快捷键

1、首先我们需要通过 fish 进入 Fish Shell, 然后再执行 fish_config 命令,这时将自动打开一个配置页面:

fishfish_config

图片

2、第一部主题颜色配置,官方默认提供了多套主题提供选择,当然如果您都不喜欢还可以自己定制主题颜色:

图片

3、第二部分则是设置命令行前面的提示符,同样的官方默认给了很多种选择, 特别的是配置页面没有提供自定义 提示符 的一个入口,如果需要自定义则需要自己修改配置文件,编写函数:

图片

图片

4、第三部分则是列出了所有的功能函数, 可以理解是所有可用命令的实现源码, 这里则不允许进行修改:

图片

5、第四部分则是列出了所有的常量,这里也不允许进行修改:

图片

6、第五部分则是记录了所有用过的命令,这里可对历史记录进行一个删除:

图片

7、第六部分则是快捷键的一个绑定,这里也是不允许进行修改:

图片

3.5 独自的自定义配置文件

Fish Shell 为用户提供了一个独立的配置文件(~/.config/fish/config.fish), 我们可以在这个文件里面写入各种自定义函数、别名、常量…,在每次启动 Fish Shell 后,该文件将被自动加载进来,这里我们可以通过 cat 来查看该配置文件​​​​​​​

$ cat ~/.config/fish/config.fish
if status is-interactive  # Commands to run in interactive sessions can go hereend

下面我们尝试在该配置文件中, 添加几个 git 相关的 别名,来进行一个简单测试

vim ~/.config/fish/config.fish
​​​​​​​
+ alias g "git"+ alias gst "git status"+ alias grs "git reset --soft"+ alias grh "git reset --hard"+ alias gb "git branch"+ alias gba "git branch -a"+ alias gl "git pull"
if status is-interactive  # Commands to run in interactive sessions can go hereend

重新打开 Fish Shell 尝试使用 别名 gl 来拉取代码,如下图发现可以正常使用 别名 则说明我们配置是生效的

图片

3.6 易懂的语法

Fish Shell 的语法更偏向于高级语言, 语法相对来说学起来比较快, 阅读起来也很清晰, 下面是几种常见语法的写法, 更多语法可查阅官网。

1、if 语句​​​​​​​

if grep fish /etc/shells  echo Found fishelse if grep bash /etc/shells  echo Found bashelse  echo Got nothingend

2、switch 语句​​​​​​​

switch (uname)  case Linux    echo Hi Tux!  case Darwin    echo Hi Hexley!  case FreeBSD NetBSD DragonFly    echo Hi Beastie!  case '*'    echo Hi, stranger!end

3、while 循环​​​​​​​

while true  echo "Loop forever"end

4、for 循环​​​​​​

for file in *.txt  cp $file $file.bakend

5、函数​​​​​​

# 定义 ll 函数(命令)function ll  ls -lhG $argvend
# 重新定义 ls 命令# 函数体内的 ls 之前, 要加上 command, 否则会因为无限循环而报错function ls  command ls -hG $argvend

四、自定「提示符」

上文提到, 在 Web 配置页面我们可以配置我们的 提示符, 但是那边只能使用官方提供的几套默认样式, 下面我们将介绍如何进行定制一个个性化的提示符!!

方法: 在配置文件 ~/.config/fish/config.fish 中,新增一个 fish_prompt 函数用于定义提示符

1、这里我们可以使用 vscode 打开配置文件, mac 访达默认情况下是不展示隐藏文件的,这里我们可以通过 com + shift + . 来查看隐藏文件, 然后将配置文件直接拖到 vscode 中进行打开

图片

2、默认情况下,vscode 是不支持 fish 语法高亮的,这里我们可以安装一个 fish 插件,这样就可以支持语法高亮、格式化了

图片

图片

3、下面我们开始定制 提示符,这里我直接给出完整代码,具体讲解可以看注释

关键语法说明:

2>/dev/null 作用是, 命令悄摸摸运行不输出任何日志
set 用于设置变量, -g 表示全局变量, -f 表示函数内部变量, 更多内容可查阅 官方文档​​​​​​​​​​​​​​

# 是否是 git 仓库, 来自 oh-my-fish: https://github.com/oh-my-fish/oh-my-fish/blob/master/lib/git/git_is_repo.fishfunction git_is_repo -d "检测当前目录是否是 git 仓库"  test -d .git  or begin    set -l info (command git rev-parse --git-dir --is-bare-repository 2>/dev/null)    and test $info[2] = false  endend
# 获取分支名, 来自 oh-my-fish: https://github.com/oh-my-fish/oh-my-fish/blob/master/lib/git/git_branch_name.fishfunction git_branch_name -d "获取当前分支名"  git_is_repo; and begin    command git symbolic-ref --short HEAD 2> /dev/null;      or command git show-ref --head -s --abbrev | head -n1 2> /dev/null  endend
# 终端提示符显示function fish_prompt -d "终端提示符"
  # 1. 时间  set -f __prompt_data (set_color -o 46C74B)"["(date "+%H时%M分%S秒")(set_color -o 46C74B)"]"
  # 2. 路径  set -f __prompt_pwd " "(set_color 00FF00)(prompt_pwd --full-length-dirs=10) 
  # 3. 获取 git 信息  if git_is_repo    # 分支状态图标配置, 更多参考: https://github.com/fish-shell/fish-shell/pull/880    set -g __fish_git_prompt_char_stagedstate "●"  # 存在暂存文件, 图标    set -g __fish_git_prompt_char_dirtystate "✚"   # 存在未追踪文件, 图标    set -g __fish_git_prompt_char_cleanstate "✔"   # 项目干净图标
    # 调用 __fish_git_prompt 读取 git 相关信息, 参考 https://github.com/fish-shell/fish-shell/issues/5748    __fish_git_prompt 2 >/dev/null;
    # 提交状态    set -f __informative_status (set_color -o bryellow)(__fish_git_prompt_informative_status)    # 分支信息    set -f __branch (set_color brred)(git_branch_name)
    set -f __prompt_git_info (set_color FF4BFF)" ("(git_branch_name)": "(set_color red)$__informative_status(set_color FF4BFF)")"  else     set -f __prompt_git_info ""  end
  echo (set_color 00BA00)"┬─"$__prompt_data$__prompt_pwd$__prompt_git_info(set_color normal)  echo (set_color 00BA00)"╰─>"(set_color FF635C)"\$ "end
if status is-interactive  # Commands to run in interactive sessions can go hereend

4、最终效果如下

图片

图片

补充:如果想要加上用户名可直接使用常量 $USER

五、修改欢迎语

如下图,每次我们切换到 Fish Shell 都会有欢迎语输出

图片

如果对于这个 欢迎语 不喜欢想要修改, 可以通过在配置文件 ~/.config/fish/config.fish 定义一个 fish_greeting 函数来进行修改​​​​​​​

function fish_greeting  echo Hello friend!  echo The time is (set_color yellow; date +%T; set_color normal) and this machine is called $hostnameend

作者:墨渊君
链接:https://juejin.cn/post/7257410068647297061

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值