Fish shell 入門教程

阮一峰發表於2017-05-02

命令列是程式設計師的必備技能。圖形介面雖然好看,解決問題還是要靠命令列。

命令列由 Shell 提供。各種命令透過 Shell,傳遞給作業系統的核心。學習命令列就是在學習 Shell。

Shell 有好幾種,目前最常用是 Bashzsh。但是,在我看來,它們都不如 Fish Shell 好用。

五年前,我第一次嘗試 Fish,感到很驚豔,一直用到現在。本文介紹 Fish 的主要特點,希望你也來嘗試它。

感謝優達學城對本文提供贊助,結尾處有他們的課程推薦。

一、簡介

Fish 是"the friendly interactive shell"的簡稱,最大特點就是方便易用。很多其他 Shell 需要配置才有的功能,Fish 預設提供,不需要任何配置。

如果你想擁有一個方便好用的 Shell,又不想學習一大堆語法,或者花費很多時間配置,那麼你一定要嘗試一下 Fish。

二、安裝

Ubuntu 和 Debian 的安裝方法。


$ sudo apt-get install fish

Mac 的安裝方法。


$ brew install fish

其他系統的安裝請參考官方網站

三、啟動與幫助

安裝完成後,就可以啟動 Fish。


$ fish

由於 Fish 的語法與 Bash 有很大差異,Bash 指令碼一般不相容。因此,我建議不要將 Fish 設為預設 Shell,而是每次手動啟動它。

使用過程中,如果需要幫助,可以輸入help命令。瀏覽器就會自動開啟,顯示線上文件。


$ help

四、彩色顯示

進入 Fish 以後,你注意到的第一件事,可能就是它預設彩色顯示。


# 無效命令為紅色
$ mkd

# 有效命令為藍色
$ mkdir

有效路徑會有下劃線。


$ cat ~/somefi 

上面程式碼表示,存在以~/somefi開頭的路徑。如果沒有下劃線,你就知道這個路徑不存在。

五、自動建議

Fish 會自動在游標後面給出建議,表示可能的選項,顏色為灰色。


# 命令建議
$ /bin/hostname

# 引數建議
$ grep --ignore-case

# 路徑建議
$ ls node_modules

如果採納建議,可以按下Control + F。如果只採納一部分,可以按下Alt + →

六、自動補全

輸入命令時,Fish 會自動顯示匹配的上一條歷史記錄。


$ git commit -m "feat: first commit"

如果沒有匹配的歷史記錄,Fish 會猜測可能的結果,自動補全各種輸入。比如,輸入pyt再按下Tab,就會自動補全為python命令。

如果有多個可能的結果,Fish 會把它們都列出,還帶有簡要介紹。


$ vi[按下 Tab 鍵]

vi (Executable link, 2.7MB)
view (Vi IMproved, 一個程式設計師的文字編輯器)
viewer.py (Executable, 967B)
viewres  (Graphical class browser for Xt)
...and 12 more rows

這時,再按一次tab,就可以在這些命令之中選擇。

除了補全命令,Fish 還可以補全引數。比如,ls命令的-l引數後面按下Tab鍵,就會顯示可以連用的其他引數。


$ ls -l[按下 Tab 鍵]

-l1  (List one file per line)
-lA  (Show hidden except . and ..)  
-la  (Show hidden)
-lB  (Ignore files ending with ~)
...and 16 more rows```

Fish 還可以自動補全 Git 分支。


$ git checkout master

七、易懂的語法

Fish 的語法非常自然,一眼就能看懂。

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

八、函式

Fish 的函式用來封裝命令,或者為現有的命令起別名。


function ll
    ls -lhG $argv
end

上面程式碼定義了一個ll函式。命令列執行這個函式以後,就可以用ll命令替代ls -lhG。其中,變數$argv表示函式的引數。

下面是另一個例子。


function ls
    command ls -hG $argv
end

上面的程式碼重新定義ls命令。注意,函式體內的ls之前,要加上command,否則會因為無限迴圈而報錯。

九、提示符

fish_prompt函式用於定義命令列提示符(prompt)。


function fish_prompt
    set_color purple
    date "+%m/%d/%y"
    set_color FF0
    echo (pwd) '>'
    set_color normal
end

執行上面的函式以後,你的命令列提示符就會變成下面這樣。


02/06/13
/home/tutorial > 

十、配置

Fish 的配置檔案是~/.config/fish/config.fish,每次 Fish 啟動,就會自動載入這個檔案。

我們可以在這個檔案裡面寫入各種自定義函式,它們會被自動載入。比如,上面的fish_prompt函式就可以寫在這個檔案裡面,這樣每次啟動 Fish,就會出現自定義的提示符。

Fish 還提供 Web 介面配置該檔案。


$ fish_config

輸入上面的命令以後,瀏覽器就會自動開啟本機的 8000 埠,使用者可以在網頁上對 Fish 進行配置,比如選擇提示符和配色主題。

(正文完)


下面是推廣時間。

最近,Angela Zhu 在她的公眾號發文《怎樣讓自己成為不可替代的程式設計師?》

"前些日子,突發奇想,在我的小密圈裡提了這樣一個問題:'未來,什麼樣的程式設計師才是不可替代的?'"

曹政回覆了一篇《當我們追求不可替代......》

"從我的歷史來說,我一直追尋的是讓自己可替代,不論是去儘可能培養年輕的接班人,還是外部延聘比我更出色的技術高手。如果沒有人可以接手我的系統,我設計的平臺,我才會覺得緊張和不安。"

這個討論涉及了很多問題。

  • 個人如何保持競爭力
  • 公司如何選人
  • 如何留住人才

這些問題沒有標準答案。但是,有一點是肯定的:程式設計師必須勇於嘗試、開拓和創新,在挑戰和失敗面前不放棄。

優達學城幫助你形成自己的競爭力。

《機器學習(奈米學位)》課程的報名本週四(5月4日)截止,主講人是大名鼎鼎的 Sebastian Thrun,他是谷歌無人駕駛汽車專案的奠基人。感興趣的朋友不要錯過,如果試聽不滿意,一週內全額退款。

優達學城還有一門《機器學習入門課程》,重點講授程式設計基礎和數學基礎(線性代數、微積分和統計學),適合不知道如何入門的年輕朋友。

另外,還有《無人駕駛汽車》《人工智慧》《機器人工程師》等課程,大家也可以關注。

(完)

相關文章