fish 是一個 Unix shell。fish 旨在成為一個比其他 shell 互動性更強、使用者體驗更好的 shell，並讓其豐富的強大功能能夠被使用者輕鬆發現、記住並學以致用。fish 的語法既不衍生於 Bourne shell 也不衍生於 C Shell，故被分類為一種 外來 shell。有別於為節約系統資源而預設停用部分功能的其他 shell，fish 的全部功能都是預設啟用的。 特色 fish 能根據使用者的輸入歷史與當前所在的目錄提供即時的自動完成。與 bash 的類似功能歷史搜尋相比，這種不必頻繁切換模式還可以用方向鍵選擇建議項的做法使使用者能更流暢地進行輸入。 fish 也擁有功能豐富的 Tab 補全功能。fish 能夠自動補全檔案路徑、變數與不少命令的引數，且支援路徑萬用字元與 C shell 的花括號展開。fish 某種意義上會透過分析命令的 man 文件生成與之相關的補全。 fish 傾向於使用命令來代替語法結構。由於命令相比語法結構能更方便地在 shell 內查到幫助內容，fish 的功能很容易在使用過程中被使用者自行發現。fish 允許子程式提供對自己的說明，進一步免去了來回查詢幫助的麻煩。fish 還允許使用者在擁有圖形使用者介面的瀏覽器內檢視幫助。 語法 fish 的語法類似於其他相容 POSIX 的 shell，但由於其開發者認為 POSIX shell 設計得有問題，fish 的語法又與 POSIX shell 有相當的不同。 下面演示將 bar 賦給變數 foo 的過程。 由於等號在其他 shell 中會根據兩端是否有空格而表現出不同的行為， fish 選擇了不在賦值中使用這個令人困惑的符號。 set 命令也可以用於陣列，並可以輕鬆設定變數的作用域。 set foo bar echo foo bar 下面演示使用命令替換將 pwd 的輸出賦給 wd 的過程。 由於重音符視覺上容易與單引號混淆且左右的符號都相同的話難以巢狀， fish 改為在命令替換中使用括號。 但與 ksh 不同的是，fish 僅在變數展開中使用美元符號。 set wd pwd echo wd 將一個有五個元素的陣列賦給 A。 set A 3 5 7 9 12 將 A 的第二個和第一個元素賦給 B。 fish 的陣列索引從 1 開始。 set B A 2 1 echo B 5 3 可以用命令替換索引陣列中的元素 seq 3 1 2 3 echo A seq 3 3 5 7 也可以用其他陣列來索引。 下面將從 A 中刪除第五個與第三個元素。 set erase A B echo A 3 5 9 for 迴圈。 for i in jpg convert i basename i jpgpng end 分號可以代替換行來標記語句的結束： for i in jpg convert i basename i jpgpng end 但由於 fish 也會在歷史記錄中分開記錄每一行，使用換行一般更加方便。 while 迴圈。 下面演示輸出 etcpasswd 中每行的第五個欄位。 cat etcpasswd while read line set arr echo linetr n echo arr 5 end 沒有子 shell 其他 shell 的部分語法結構，例如管道、子程式與迴圈，是使用一種稱為子 shell 的方式實現的。所謂子 shell 即臨時執行一個用完即退出的新的子程序。在子 shell 中執行的修改通常不符合一般人的直覺地，不會反映到真正的 shell 上（即沒有函式副作用）。fish 不依賴於子 shell 實現其語法結構，故所有內建命令在任何語境下都是會正常運作的。 相當多的 shell 會將 read 在單獨的子 shell 中執行，所以如下語句在他們中無法按預期工作。 在常見 shell 中，bash 的管道右邊無法產生副作用，故 line 並不會被賦值； ksh 中 line 會被正確賦值，但管道左邊的語句無法產生副作用； 但是 fish 和 zsh 一樣，允許管道兩邊都能有副作用。 cat txt read line 例如，下述 bash 指令碼會因為子 shell 而導致迴圈內部給 found 賦的值在退出迴圈後即消失 found cat etcfstab while read dev mnt rest do if test mnt then founddev fi done 而需要用另一種方式來規避這個問題： found while read dev mnt rest do if test mnt then founddev fi done etcfstab 如下的 fish 指令碼則無需擔心子 shell 會影響副作用。 set found cat etcfstab while read dev mnt rest if test mnt set found dev end end 有用的錯誤資訊 fish 會在發生錯誤時清晰地指出出錯的位置並給出修正的方法。 foobar fish Unknown command foobar Did you mean set VARIABLE VALUE For information on setting variable values see the help section on the set command by typing help set fish：未知的命令 foobar。你是想輸入 set 變數 值 嗎？ 關於如何設定變數的值，請輸入 help set 獲取 set 命令的幫助。 echo foo bar fish Did you mean VARIABLE The character begins a variable name A bracket which directly followed a is not allowed as a part of a variable name and variable names may not be zero characters long To learn more about variable expansion in fish type help expandvariable fish：你是想輸入 變數 嗎？美元符號 僅用於變數名開頭，而美元符號後的 那個花括號並不能作為變數名稱的一部分，且變數也不能沒有名稱。 關於如何展開變數，請輸入 help expandvariable。 echo pwd fish Did you mean COMMAND In fish the character is only used for accessing variables To learn more about command substitution in fish type help expandcommandsubstitution fish 你是想輸入 命令 嗎？在 fish 中，美元符號 僅用於訪問變數。 關於如何進行命令替換，請輸入 help expandcommandsubstitution。 通用變數 Fish 有一個名為通用變數的功能。透過利用通用變數，使用者可以在多個同時執行的 fish 例項之間共享一個變數。即使使用者登出或者計算機重啟，通用變數的值也不會丟失。 將 emacs 設定為預設文字編輯器。 universal 或者 U 表示設定通用變數。 set universal EDITOR emacs 如下命令會把 fish 的提示符中的當前目錄變成藍色。 不止執行命令的這個 fish，現在所有正在執行的 fish 的提示符都會發生變化。 set universal fish_color_cwd blue 其它功能 高階 tab 補全 帶完備的錯誤檢查的語法高亮 支援 X Window 系統的剪貼簿 基於的智慧終端處理 可搜尋的命令列歷史記錄 第二版還加入瞭如下功能： 自動補全 支援 256 色 基於網頁的配置功能 能夠提升效能的更多的內建命令 參考 另請參閱 Unix shell 外部連結 專案主頁 GitHub 上的 fish 倉庫 上的 fish 倉庫（不再使用） SourceForge 上的 fish 倉庫（不再使用） Fishusers fish 使用者的綜合討論列表 bash 到 fish 的命令翻譯對照 Category 指令碼語言 Category 用 C 程式設計的自由軟體 Category 面向文字程式語言 CategoryUnix shells