命令列是程式設計師的必備技能。圖形介面雖然好看,解決問題還是要靠命令列。
命令列由 Shell 提供。各種命令透過 Shell,傳遞給作業系統的核心。學習命令列就是在學習 Shell。
Shell 有好幾種,目前最常用是 Bash 和 zsh。但是,在我看來,它們都不如 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,他是谷歌無人駕駛汽車專案的奠基人。感興趣的朋友不要錯過,如果試聽不滿意,一週內全額退款。
優達學城還有一門《機器學習入門課程》,重點講授程式設計基礎和數學基礎(線性代數、微積分和統計學),適合不知道如何入門的年輕朋友。
另外,還有《無人駕駛汽車》、《人工智慧》、《機器人工程師》等課程,大家也可以關注。
(完)