专为 90 后定制的 Shell, 我倒要看看有啥不一样!!!
Linux就该这么学 2023-11-12 08:02 发表于北京
转自:掘金稀土 链接:https://juejin.cn/post/7257410068647297061
引言
当提到命令行界面(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
下安装方式, 更多系统对应安装方法可参考 官方文档
-
1 | brew install fish |
上图中框出的部分是
fish
的安装路径, 这里最好简单记下, 后面需要用到
二、切换
2.1 手动切换
默认情况下命令行终端使用的 Shell
是 Bash
或者 zsh
, 这里我们需要通过 fish
命令切换到 Fish Shell
-
1 | fish |
-
1 | 这里如果需要退出 Fish Shell 可执行 exit 命令进行退出exit |
2.2 设置为默认 Shell
如果您希望使用
Fish Shell
作为默认的shell
, 可使用以下命令:
在开始之前我们需要先确认下 fish
的安装路径, 在安装 fish
时输出日志中会给出对应的安装地址
下面我们需要在 /etc/shells
中追加 fish
的 脚本
路径, 否则在切换默认 Shell
时会报 non-standard shell
错误, 脚本路径为: {fish 安装路径}/bin/fish
-
1 | sudo vim /etc/shells |
下面我们通过 chsh -s
来切换默认 Shell
-
1 | chsh -s /opt/homebrew/Cellar/fish/3.6.1/bin/fish |
切换完后, 我们重新开一个终端将默认使用 Fish Shell
如果需要切换回去, 只需需要执行 chsh -s /bin/zsh
或 chsh -s /bin/bash
即可
-
1 | chsh -s /bin/zsh |
最后补充: 由于 Fish Shell
的语法与 Bash
有很大差异, 对 Bash
脚本可能会出现不兼容, 因此建议不要将 Fish Shell
设为默认 Shell
, 而是每次手动启动它
三、好用特性介绍
3.1 命令行语法高亮
Fish Shell
在我们输入命令时就会对语法进行高亮, 这里最重要的要数 潜在错误
的检测, 也就是在输入命令且未执行前, 就可以提前对输入的内容进行检测, 并对检测结果进行高亮, 相关高亮逻辑有:
- 有效命令默认高亮为蓝色
- 无效命令默认高亮为红色
- 对于有效路径会有下划线提示
- 不匹配的括号或者逗号
3.2 自动补全建议
Fish Shell
自带 命令补全建议
功能, 当我们输入命令后, 我们将在光标后看到以柔和的灰色显示的推荐内容, 这些内容可能是 Fish Shell
推导出来的, 也有可能是历史使用过的命令
如果要采纳建议, 可以按下 ->
如果只采纳一部分, 可以按下 Alt + ->
3.3 Tab 选项
如果我们需要想查看
给定命令
是否还有其他可能性, 那么在输入几个字母后, 只需按一下Tab
键即可
- 如下是输入完
git
直接按Tab
的结果, 它直接列出了所有可能命令以及描述
- 这里是输入
git
以及空格后按下Tab
的结果, 它将给出git
的所有可能命令以及描述
- 当然除了补全命令, 它还可以补全参数, 如下是输入
-
后按下Tab
的结果, 它将给出git commit
的所有可能参数以及描述
3.4 基于 Web 的配置器
Fish Shell
相对于其他Shell
有一个比较有意思的功能, 就是可以通过浏览器来配置或查看Shell
的主题、提示、功能函数、常量、历史记录、快捷键
- 首先我们需要通过
fish
进入Fish Shell
, 然后再执行fish_config
命令, 这时将自动打开一个配置页面
-
1 | fishfish_config |
- 第一部
主题颜色
配置, 官方默认提供了多套主题提供选择, 当然如果您都不喜欢还可以自己定制主题颜色
- 第二部分则是设置命令行前面的
提示符
, 同样的官方默认给了很多种选择, 特别的是配置页面没有提供自定义提示符
的一个入口, 如果需要自定义则需要自己修改配置文件, 编写函数
- 第三部分则是列出了所有的功能函数, 可以理解是所有可用命令的实现源码, 这里则不允许进行修改
- 第四部分则是列出了所有的常量, 这里也不允许进行修改
- 第五部分则是记录了所有用过的命令, 这里可对历史记录进行一个删除
- 第六部分则是快捷键的一个绑定, 这里也是不允许进行修改
3.5 独自的自定义配置文件
Fish Shell
为用户提供了一个独立的配置文件(~/.config/fish/config.fish
), 我们可以在这个文件里面写入各种自定义函数、别名、常量…, 在每次启动 Fish Shell
后, 该文件将被自动加载进来, 这里我们可以通过 cat
来查看该配置文件
-
1 | $ cat ~/.config/fish/config.fishif status is-interactiveend |
下面我们尝试在该配置文件中, 添加几个 git
相关的 别名
, 来进行一个简单测试
-
-
-
-
-
-
1 | vim ~/.config/fish/config.fish |
-
1 | if status is-interactive # Commands to run in interactive sessions can go hereend |
重新打开 Fish Shell
尝试使用 别名
gl
来拉取代码, 如下图发现可以正常使用 别名
则说明我们配置是生效的
3.6 易懂的语法
Fish Shell
的语法更偏向于高级语言, 语法相对来说学起来比较快, 阅读起来也很清晰, 下面是几种常见语法的写法, 更多语法可查阅 官网
if
语句
-
1 | if grep fish /etc/shellsecho Found fishelse if grep bash /etc/shellsecho Found bashelseecho Got nothingend |
switch
语句
-
1 | switch (uname)case Linuxecho Hi Tux!case Darwinecho Hi Hexley!case FreeBSD NetBSD DragonFlyecho Hi Beastie!case '*'echo Hi, stranger!end |
while
循环
-
1 | while trueecho "Loop forever"end |
for
循环
-
1 | for file in *.txt cp $file $file.bakend |
- 函数
-
1 | function ll ls -lhG $argvendfunction ls command ls -hG $argvend |
四、自定「提示符」
上文提到, 在 Web
配置页面我们可以配置我们的 提示符
, 但是那边只能使用官方提供的几套默认样式, 下面我们将介绍如何进行定制一个个性化的 提示符
!!
方法: 在配置文件 ~/.config/fish/config.fish
中, 新增一个 fish_prompt
函数用于定义 提示符
- 这里我们可以使用
vscode
打开配置文件,mac
访达默认情况下是不展示隐藏文件的, 这里我们可以通过com + shift + .
来查看隐藏文件, 然后将配置文件直接拖到vscode
中进行打开
- 默认情况下, vscode 是不支持 fish 语法高亮的, 这里我们可以安装一个 fish 插件, 这样就可以支持语法高亮、格式化了
- 下面我们开始定制
提示符
, 这里我直接给出完整代码, 具体讲解可以看注释
关键语法说明:
2>/dev/null
作用是, 命令悄摸摸运行不输出任何日志set
用于设置变量,-g
表示全局变量,-f
表示函数内部变量, 更多内容可查阅 官方文档
1 |
-
1 | function git_is_repo -d "检测当前目录是否是 git 仓库" test -d .git or beginset -l info (command git rev-parse --git-dir --is-bare-repository 2>/dev/null)and test $info[2] = falseendendfunction 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/nullendendfunction fish_prompt -d "终端提示符"set -f __prompt_data (set_color -o 46C74B)"["(date "+%H时%M分%S秒")(set_color -o 46C74B)"]"set -f __prompt_pwd " "(set_color 00FF00)(prompt_pwd --full-length-dirs=10) if git_is_reposet -g __fish_git_prompt_char_stagedstate "●"set -g __fish_git_prompt_char_dirtystate "✚"set -g __fish_git_prompt_char_cleanstate "✔" __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)")"elseset -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)"\$ "endif status is-interactiveend |
- 最终效果如下
补充: 如果想要加上用户名可直接使用常量 $USER
五、修改欢迎语
如下图, 每次我们切换到 Fish Shell 都会有 欢迎语
输出
如果对于这个 欢迎语
不喜欢想要修改, 可以通过在配置文件 ~/.config/fish/config.fish
定义一个 fish_greeting
函数来进行修改
1 |
-
1 | function fish_greetingecho Hello friend!echo The time is (set_color yellow; date +%T; set_color normal) and this machine is called $hostnameend |
转载请注明来源,欢迎对文章中的引用来源进行考证,欢迎指出任何有错误或不够清晰的表达。可以在下面评论区评论,也可以邮件至 jaytp@qq.com