来自:马哥linux运维
当提到命令行界面(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
的安装路径, 这里最好简单记下, 后面需要用到
默认情况下命令行终端使用的 Shell
是 Bash
或者 zsh
, 这里我们需要通过 fish
命令切换到 Fish Shell
fish
这里如果需要退出 Fish Shell 可执行 exit 命令进行退出
exit
如果您希望使用
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
, 而是每次手动启动它
Fish Shell
在我们输入命令时就会对语法进行高亮, 这里最重要的要数 潜在错误
的检测, 也就是在输入命令且未执行前, 就可以提前对输入的内容进行检测, 并对检测结果进行高亮, 相关高亮逻辑有:
Fish Shell
自带 命令补全建议
功能, 当我们输入命令后, 我们将在光标后看到以柔和的灰色显示的推荐内容, 这些内容可能是 Fish Shell
推导出来的, 也有可能是历史使用过的命令
如果要采纳建议, 可以按下 ->
如果只采纳一部分, 可以按下 Alt + ->
如果我们需要想查看
给定命令
是否还有其他可能性, 那么在输入几个字母后, 只需按一下Tab
键即可
git
直接按 Tab
的结果, 它直接列出了所有可能命令以及描述git
以及空格后按下 Tab
的结果, 它将给出 git
的所有可能命令以及描述-
后按下 Tab
的结果, 它将给出 git commit
的所有可能参数以及描述
Fish Shell
相对于其他Shell
有一个比较有意思的功能, 就是可以通过浏览器来配置或查看Shell
的主题、提示、功能函数、常量、历史记录、快捷键
fish
进入 Fish Shell
, 然后再执行 fish_config
命令, 这时将自动打开一个配置页面
fish
fish_config
主题颜色
配置, 官方默认提供了多套主题提供选择, 当然如果您都不喜欢还可以自己定制主题颜色提示符
, 同样的官方默认给了很多种选择, 特别的是配置页面没有提供自定义 提示符
的一个入口, 如果需要自定义则需要自己修改配置文件, 编写函数 Fish Shell
为用户提供了一个独立的配置文件(~/.config/fish/config.fish
), 我们可以在这个文件里面写入各种自定义函数、别名、常量..., 在每次启动 Fish Shell
后, 该文件将被自动加载进来, 这里我们可以通过 cat
来查看该配置文件
$ cat ~/.config/fish/config.fish
if status is-interactive
end
下面我们尝试在该配置文件中, 添加几个 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
来拉取代码, 如下图发现可以正常使用 别名
则说明我们配置是生效的
Fish Shell
的语法更偏向于高级语言, 语法相对来说学起来比较快, 阅读起来也很清晰, 下面是几种常见语法的写法, 更多语法可查阅 官网
if
语句
if grep fish /etc/shells
echo Found fish
else if grep bash /etc/shells
echo Found bash
else
echo Got nothing
end
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
while
循环
while true
echo "Loop forever"
end
for
循环
for file in *.txt
cp $file $file.bak
end
function ll
ls -lhG $argv
end
function ls
command ls -hG $argv
end
上文提到, 在 Web
配置页面我们可以配置我们的 提示符
, 但是那边只能使用官方提供的几套默认样式, 下面我们将介绍如何进行定制一个个性化的 提示符
!!
方法: 在配置文件 ~/.config/fish/config.fish
中, 新增一个 fish_prompt
函数用于定义 提示符
vscode
打开配置文件, mac
访达默认情况下是不展示隐藏文件的, 这里我们可以通过 com + shift + .
来查看隐藏文件, 然后将配置文件直接拖到 vscode
中进行打开提示符
, 这里我直接给出完整代码, 具体讲解可以看注释关键语法说明:
2>/dev/null
作用是, 命令悄摸摸运行不输出任何日志set
用于设置变量, -g
表示全局变量, -f
表示函数内部变量, 更多内容可查阅 官方文档
function 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
end
end
function 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
end
end
function 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_repo
set -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)")"
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
end
补充: 如果想要加上用户名可直接使用常量 $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 $hostname
end
原文链接:https://juejin.cn/post/7257410068647297061