Fish Shell 的使用特性和優勢

Linksla發表於2023-11-20

引言

當提到命令列介面(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 here 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 here end

      重新開啟 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 
        $argv
        
        
        end
        
        
        
        # 重新定義 ls 命令 # 函式體內的 ls 之前, 要加上 command, 否則會因為無限迴圈而報錯 function ls  command ls -hG $argv end

        四、自定「提示符」

        上文提到, 在 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: 
          
          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
          
          
          
          # 獲取分支名, 來自 oh-my-fish: 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 "終端提示符"
            # 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     # 分支狀態圖示配置, 更多參考:     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 相關資訊, 參考    __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 here end

          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

          作者:墨淵君
          連結:


          來自 “ ITPUB部落格 ” ,連結:http://blog.itpub.net/70013542/viewspace-2996070/,如需轉載,請註明出處,否則將追究法律責任。

          相關文章