使用 Fish Shell 获得更好的 Linux 体验

過去的加密命令和嚴格的語法已經一去不復返。為什麼要花更多時間解讀手冊頁面,而不是編寫腳本或導航系統呢?擁抱 fish shell 的強大和簡潔,它是您更流暢、更直觀的 Linux 體驗的通行證。

學會如何通過 fish shell 改變您的 Linux 之旅,從其用戶友好的界面到其豐富的定製選項。

對於流程的精簡和對 Linux 技能的新信心,表示歡迎!

先決條件

在開始之前,請確保您已經具備了以下必要條件,以便在本教程中跟隨:

探索命令驗證、自動完成和建議

使用安裝了 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 配置文件會自動執行,是定義外殼自定義的理想場所。

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 還讓你有能力自定義提示,就像為你的外殼添加個人風格一樣。享受一個更乾淨、更有組織的提示,而不是冗長的目錄路徑。

要自定義 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命令來確認安裝,查看你系統當前安裝的--version Fisher。

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 插件的威力。但這是一個關鍵:這個框架為 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 的完美 theme

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 是一個增添你的終端機氛圍的寶石。但如果你想要改變風景或試試新的東西,卸載 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)作為默認 shell。確保在步驟二和步驟三中指定 Bash 的路徑,然後重新啟動您的機器以應用更改。

結論

在本教程中,您深入探討了 fish shell 的本質,揭示了其強大的功能和可自定義的選項。從定義別名到自定義提示,再到持久化環境變量和管理插件,fish shell 一直是您可靠的助手。

您已經獲得了使用 Oh My Fish 套件管理器來轉換 Linux 體驗的洞察力。此外,您還了解了如何輕鬆發現和安裝新的插件和主題,擴展了您的 fish shell 環境的功能和美學。

現在你已經探索了 fish shell 的基礎知識,深入挖掘並發揮其全部潛力。為什麼不試試自定義提示符,像是 PowerlineStarship,為你的 shell 添加個人化的風格呢?

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