通过Fish Shell获得更好的Linux体验

过去是晦涩的命令和死板的语法时代。为什么要花费更多时间解读 man 页面,而不是编写脚本或浏览系统呢?拥抱 fish shell 的强大和简洁,它是让您体验更流畅、更直观的 Linux 的通行证。

学会如何用 fish shell 改变您的 Linux 之旅,从其用户友好的界面到其丰富的自定义选项。

与流程工作流程和对您的 Linux 技能的新信心打个招呼吧!

先决条件

在开始之前,请确保您已经掌握了以下基本要点,以便跟随本教程:

  • 已在您的计算机上安装了 Fish Shell – 本教程使用 fish-3.7.0,截至撰写本文时的最新版本。
  • A Linux system – This tutorial uses an Ubuntu 22.04 LTS for demonstrations, but other distributions will work.

探索命令验证、自动完成和建议

使用安装了 fish shell 的 fish shell,进行无缝命令执行。fish shell 提供实时反馈和上下文感知的命令、文件名和参数建议。

但首先,您需要进入 fish shell,然后再深入探讨命令验证、自动完成和建议。

要探索此功能,它允许您在执行命令之前识别和纠正错误,请执行以下操作:

1. 打开终端并运行下面的fish命令以访问fish shell。

fish
Accessing the fish shell

2. 接下来,键入ls命令的第一个字母,尝试列出当前目录中的所有文件。

如下所示,字母’l‘变成了红色,因为fish shell不将其识别为有效命令。这种即时的视觉提示表明命令存在问题。

但不用担心!由于自动建议,字母’s‘会呈现出静音状态,提示正确的命令。

Testing command validation

3. 现在,按右箭头键或Ctrl+F键以接受自动建议的ls命令。

注意,字母’l’已经从红色变成蓝色,因为fish shell现在将您的命令识别为ls

Accepting the auto-suggested command

在Fish配置文件中定义命令别名

除了实时反馈和上下文感知的建议之外,fish还提供了一种强大灵活的方式来自定义您的命令行环境 – fish配置文件。与其他可能使用多个配置文件的shell不同,fish主要使用一个名为config.fish的单个文件,位于~/.config/fish/目录中。

要了解配置如何影响fish shell,请从以下方式开始定义命令别名:

1. 使用您喜欢的代码或文本编辑器打开fish配置文件,例如nanovim,但本教程使用前者。

nano ~/.config/fish/config.fish

一旦打开,您将看到fish shell配置文件的初始内容,其中可能包含默认配置或相对为空。此初始状态取决于您或您系统的设置过程是否已添加配置。

该文件可能只包含注释或用于新安装的基本条件块,例如以下示例。

Opening the fish configuration file

2. 在if块内添加以下function,保存更改并关闭编辑器。

此时,您正在fish配置文件中创建自定义设置,此函数定义了一个别名(c)用于clear命令。

#此函数为命令"clear"创建一个别名
function c
    clear
end

? 注意:每个定义的函数都在~/.config/fish/functions/目录中有一个对应的.fish文件(即c.fish)。

Creating an alias for the clear command

3. 执行以下命令以source配置文件(config.fish)。

这个命令不会在终端输出任何内容,但会将配置更改应用到当前会话中。

? 每次启动新的fish会话时,都会自动执行此fish配置文件,是定义shell自定义的完美位置。

source ~/.config/fish/config.fish

4. 然后,在提示符中键入c以验证您的更改。

请注意,字母’c‘变蓝了,因为fish shell将其识别为clear命令。这种行为表示fish配置已成功更改。

看到字母’c‘变蓝了吗?这种变化是因为fish shell知道字母’c‘是clear命令。这种行为表示您的fish配置已成功更新。

现在,为什么不为那些您在心情来时总是返回的可靠命令设置一些更多的别名呢?

Verifying the newly created alias for the clear command works

定制Fish Shell提示符

除了设置别名以实现更顺畅的操作外,fish还让您有能力自定义提示符,就像为您的shell添加个人风格一样。享受更干净、更有组织的提示符,而不是冗长的目录路径。

要自定义fish shell提示符,请执行以下操作:

1. 打开fish配置文件(~/.config/fish/config.fish),并添加以下函数。

此函数定制了您的fish shell提示符,以显示(echo)一个美元符号($)后跟一个空格。

# 自定义fish提示符
function fish_prompt
    echo '$ '
end
Customizing the fish shell prompt

2. 将更改保存到fish配置文件并退出编辑器。

3. 现在,source配置文件以应用更改。

source ~/.config/fish/config.fish

一旦应用,您会看到提示符的更改,就像以下屏幕截图中所示。

Sourcing the fish configuration file to apply the shell prompt changes

跨会话持久更改

您已经了解了如何在fish shell中创建自定义设置。但有一点需要注意:这些设置仅在当前会话中可用。

一旦关闭当前会话并打开新会话,会发生什么?哇!您精心制作的配置都消失了——糟糕,对吧?但不用担心,仍有希望。让funcsave命令从遗忘中拯救您的配置!

要跨会话持久保存您的配置,请按以下步骤进行:

1. 打开fish配置文件,并将funcsave命令附加到每个function以及函数名称,如下所示:

Appending the funcsave command to persist functions across sessions

2. 保存更改,并关闭编辑器和终端。

3. 打开一个新的终端会话,并运行下面的fish命令以访问fish shell

fish

如果您附加的funcsave命令可以在持久保存配置中正常工作,您将会看到以下类似的消息。

Accessing the fish shell to verify the configurations persist across sessions

设置和持久化环境变量

虽然持久化函数很棒,但管理全局可访问值将shell脚本提升了一个档次——设置环境变量。与依赖export的传统shell不同,fish使用set命令并附加选项来控制变量的范围和导出行为。

但是,有一个问题,你知道吗?啊,你猜对了!通过终端使用set命令设置的变量仅在当前会话中可访问。

为了设置和持久化环境变量,-gx标志将派上用场,如下所示:

1. 添加以下命令到set在fish配置文件中设置MY_VARIABLE变量为全局。下面是-gx标志的工作方式:

  • -g – 使变量成为全局变量,在同一用户环境的任何范围内均可访问。
  • -x – 导出变量,使其对从fish启动的任何外部命令或程序可用。
# 设置MY_VARIABLE为全局并导出它
set -gx MY_VARIABLE HelloWorld
Setting an environment variable in the fish configuration file

2. 保存配置更改,然后关闭编辑器和终端。

3. 打开一个新的终端会话,访问fish shell,并运行以下命令以确认更改。

echo $MY_VARIABLE

下面的输出确认了跨会话的更改已经生效。

Verifying variable persistence

4. 确认后,将以下set命令添加到fish配置文件中,保存更改,并关闭编辑器。

此命令使MY_UNIVERSAL_VARIABLE变量在所有会话中都是全局的,即使在重新启动后也是如此。

# 设置MY_UNIVERSAL_VARIABLE为全局并导出
set -Ux MY_UNIVERSAL_VARIABLE universal

查看下面-Ux标志的工作方式:

  • -U – 使MY_UNIVERSAL_VARIABLE变量成为全局变量,确保它在所有当前和未来的终端会话中共享,包括不同用户的会话。
  • -x – 将变量导出到子进程,使其可以被从当前会话调用的任何命令或脚本访问。
Setting a universal environment variable in the fish configuration file

5. 打开一个新的终端会话,访问fish shell,并运行下面的echo命令以验证更改。

echo $MY_UNIVERSAL_VARIABLE

如果一切顺利,您将会得到以下输出,表明跨会话的更改已经生效。

Verifying universal variable persistence

? 除了fish配置文件外,利用终端中的fish_config命令进行快速和自动应用的自定义设置。此命令会在您的浏览器中启动一个Web界面,使您可以方便地进行提示调整、设置调整以及函数和变量管理。

使用Fisher软件包管理器管理Fish插件

鱼壳(Fish Shell)本身已经很强大了,是吧?但你知道吗?当你开始集成插件时,它变得更加强大。这些插件扩展了鱼壳的功能,引入了新的命令、实用工具和集成,极大地增强了你的命令行体验。

一个很好的例子是 Fisher,这是专为鱼壳设计的软件包管理器。这个插件以性能和简单性为设计目标,而且很轻量级。

? Fisher 在管理鱼壳插件方面是轻量级的,并且不能直接与系统级软件包管理器进行比较。就所管理的软件包的大小和复杂性而言,这种区别是明显的。

要管理鱼壳插件,你首先必须按照以下步骤安装 Fisher:

打开终端,进入鱼壳,并执行以下命令来下载并安装 Fisher。这个命令获取 Fisher 安装脚本并将其管道传输到 source,通过 curl 在当前的鱼壳会话中执行脚本。

curl -sL https://raw.githubusercontent.com/jorgebucaran/fisher/main/functions/fisher.fish | source && fisher install jorgebucaran/fisher

安装完成后,你会看到以下输出。

Installing the Fisher package manager

现在,运行下面的 fisher 命令,通过查看系统当前安装的 Fisher 的 --version 来确认安装。

fisher --version
Confirming the installed Fisher version

安装 GitNow 插件

现在你已经让Fisher运行起来了,接下来呢?如何为你的fish shell增加一些酷炫的插件?例如,GitNow是一个可以在fish shell中强化你的Git工作流程的工具包——很诱人。

GitNow提供了简化常规Git任务的命令,提高了生产力并简化了你的Git命令流程。

要使用Fisher软件包管理器安装GitNow,请按照以下步骤操作:

1. 在你的fish shell中,执行以下fisher命令以安装GitNow插件(joseluisq/gitnow)。

这个命令告诉Fisher去获取并集成GitNow到你的fish配置中,使其各种Git快捷方式立即可用。

fisher install joseluisq/gitnow
Installing the GitNow plugin

2. 安装完成后,运行下面的gitnow命令来确认GitNow是否已正确安装。

该命令将显示已安装的GitNow版本,但只有在你的shell中识别到GitNow命令时才会显示。

gitnow --version
Verifying the GitNow installation

3. 最后,运行这个fisher命令以列出Fisher管理的所有插件,包括GitNow。

fisher list

下面,你可以看到GitNow插件和Fisher插件本身。

Viewing all plugins managed by Fisher

移除Fish Shell插件

你的fish shell是否被插件淹没了?就像你被留在一堆混乱中需要找到你所需要的东西一样?通过移除不必要的插件来整理你的fish shell环境。

要在您的fish shell中删除由Fisher管理的插件,请按照以下步骤进行:

1. 执行以下命令以列出所有当前安装的插件。

fisher list

从列表中选择您想要删除的一个。

Viewing all installed plugins

2. 接下来,运行下面的fisher remove命令,然后是插件名称(joseluisq/gitnow)以进行删除。

fisher remove joseluisq/gitnow

此命令告诉Fisher从您的fish shell环境中卸载GitNow插件。

Removing the GitNow plugin

3. 现在,运行相同的fisher list命令来确认GitNow插件已成功删除。

fisher list

GitNow插件不应再出现在已安装插件列表中。

Verifying the GitNow plugin removal

卸载Fisher包管理器

如您所见,Fisher包管理器确实非常方便。但是,如果您发现自己不满意或与Fisher有困扰,卸载它可能是您的最佳选择。

要彻底从您的fish shell中卸载Fisher,请完成以下步骤:

执行以下命令列出删除通过Fisher安装的fisher和所有插件。

fisher list | fisher remove
Listing and removing all plugins

或者,执行以下命令仅删除fisher本身。

fisher remove jorgebucaran/fisher
Removing Fisher only

探索Oh My Fish包管理器

当你已经使用 Fisher 轻松愉快时,为什么要考虑使用 Oh My Fish?你已经体验到了 Fisher 的强大,但这就是关键所在:这个框架为 fish shell 打开了一个全新的定制领域,提供了大量的主题和插件。

要查看 Oh My Fish 为你提供了什么,首先使用以下命令安装这个包管理器:

运行以下 curl 命令,在 fish shell 中下载并运行 Oh My Fish 安装脚本(https://get.oh-my.fish)。

curl -L https://get.oh-my.fish | fish

如果成功,你将会得到类似以下的输出。

Installing the Oh My Fish package manager

安装完成后,执行以下命令 omf 来检查 Oh My Fish 的安装版本。

omf --version

A successful response, as shown below, indicates that Oh My Fish is ready and waiting to transform your fish shell experience.

Verifying the Oh My Fish installation

使用 Oh My Fish 主题自定义环境

厌倦了老套的 fish shell 外观?为什么不增添一点个性?使用 Oh My Fish 提供的新鲜、个性化的主题,为你的 fish shell 环境进行一次改头换面吧。

要自定义你的 fish shell 环境,你需要按照以下步骤安装主题:

1. 打开 fish 配置文件,并移除定义你的提示符如何显示的 fish_prompt 函数。这样做可以确保你设置的自定义提示符不会与 Oh My Fish 提供的主题发生冲突或覆盖。

? 主题带有独特的提示,对于其外观和功能至关重要。禁用自定义提示(fish_prompt)可确保您选择的 Oh My Fish 主题完全整合其设计和功能到您的 fish shell 中。

2. 接下来,删除(rm~/.config/fish/functions/fish_prompt.fish 文件。此命令不产生输出,但删除此文件可确保 fish shell 恢复到其默认提示。

rm ~/.config/fish/functions/fish_prompt.fish

3. 运行以下 source 命令,以使 fish 配置文件中的更改生效。

source ~/.config/fish/config.fish
Sourcing the fish configuration file

4. 现在,执行以下 omf 命令,以发现适合您的 fish shell 的完美 主题

omf theme

选择一个您希望整合到 fish shell 中的主题(例如,cbjohnson)。

? 在安装主题之前,访问官方 GitHub 仓库了解 Oh My Shell 主题 的外观。

Listing available Oh My Fish themes

? 通过运行以下命令安装插件,增强您的 fish shell。访问 OMF GitHub 仓库 查看要安装的插件列表。omf install <plugin_name>

5. 然后,运行下面的命令来安装您在第四步中选择的主题(cbjohnson)。

omf install cbjohnson

安装完成后,您的提示会立即更改,如下所示。

Installing an Oh My Fish theme (cbjohnson)

? 提示:当您有两个或更多主题时,可以通过运行以下命令快速切换主题。omf theme <主题名称>

卸载 Oh My Fish

Oh My Fish 是一个增强您 shell 感觉的宝石。但如果您想要改变环境或尝试新东西,卸载 Oh My Fish 将使您的 fish shell 重新开始。

要卸载 Oh My Fish,请执行以下操作:

1. 执行以下 rm 命令来删除所有与 Oh My Fish 相关的文件。

rm -rf ~/.local/share/omf
rm -rf ~/.config/omf

删除后,您会看到最初安装的主题消失。

Deleting Oh My Fish-related files

2. 接下来,执行下面的每个命令来删除更多与 Oh My Fish 相关的文件。

这些命令没有输出,但删除这些文件可以确保您的系统中所有与 Oh My Fish 相关的残留都已删除。

rm -rf ~/.local/share/omf/pkg/omf/functions/omf.fish
rm ~/.config/fish/conf.d/omf.*

3. 现在,运行以下 omf 命令来验证删除。

omf --version

您会看到以下错误,表明找不到 omf 命令,并且 Oh My Fish 已完全卸载。

Verifying the Oh My Fish deletion

将 Fish 设置为默认 Shell

如果您喜欢使用 fish shell 来增强您的 Linux 经验,为什么不将其设置为默认 shell 呢?这样,每当您启动新终端时,就不必再切换。

要将 fish 设置为默认 shell,请执行以下步骤:

1. 执行以下命令来找到 which 路径,指定 fish shell 的位置。

which fish

复制路径到剪贴板,因为你在接下来的步骤中会需要它。

Finding the path to the fish shell

2. 接下来,运行以下命令将 fish 添加到可接受 shell 列表中的 /etc/shells

echo "/usr/bin/fish" | sudo tee -a /etc/shells
Adding fish to the list of acceptable shells

3. 最后,运行以下 chsh 命令来将默认 shell 更改为 fish (/usr/bin/fish)。

chsh -s /usr/bin/fish

当你重新启动你的机器时,你将拥有 fish 作为你的默认 shell。

Changing the default shell to fish

? 提示:通过重复本节中的所有步骤,将默认 shell 从 fish 切换回其他 shell(比如 Bash)。确保在第二步和第三步中指定 Bash 的路径,然后重新启动你的机器以应用更改。.

结论

在本教程中,你深入探讨了 fish shell 的本质,揭示了其强大的特性和可定制的选项。从定义别名到定制提示符,再到持久化环境变量和管理插件,fish shell 一直是你可信赖的助手。

你了解了如何通过 Oh My Fish 包管理器来改变你的 Linux 体验。此外,你学会了如何轻松地发现和安装新的插件和主题,扩展了你的 fish shell 环境的功能和美观程度。

现在您已经探索了fish shell的基础知识,深入了解并发挥其全部潜力吧。为什么不尝试使用自定义提示,比如PowerlineStarship,为您的shell增添个性化的风格呢?

Source:
https://adamtheautomator.com/fish-shell/