切換到ZSH以後遇到的坑

黃博文發表於2014-03-28

瞭解到ZSH的強大以後打算將自己目前使用的bash切換到ZSH。具體ZSH比bash強在那裡就不多少了,網上的文章一搜一大把。個人主要是被ZSH強大的自動補全吸引過來的。雖然bash裝了bash-completaion以後也有了一定的自動補全能力,但是和ZSH比起來還是差距太大。

ZSH雖然功能強大,但是配置繁瑣,並且shell指令碼的語法一向比較奇葩,如果自己定製還需要對shell指令碼有一定的瞭解。本來想用ZSH來節省時間,但是還要花大量時間來配置ZSH無疑會生使眾多程式設計師望而卻步。好在github有oh-my-ZSH這個專案,自動把大量的配置給你搞好了,基本上做到了開箱即用。

具體如何安裝ZSH和配置oh-my-zsh就不多說了,請參見https://github.com/robbyrussell/oh-my-zsh

安裝完畢後執行chsh -s /bin/zsh將當前預設的shell切換為zsh。另外需要做的是要將以前~/.bash_profile中的配置複製到~/.zshrc中,這樣保證以前在bash中定義的別名、命令等可以繼續正常工作。

雖然說ZSH無縫相容bash,但是剛開始使用還是遇到了一些坑,好歹都一一解決了。

編碼問題

當我執行Octopress部落格的生成部落格命令時,遇到了這個奇怪的錯。

1
2
3
$ rake generate

YAML Exception reading 2013-12-15-responsive-menu-by-media-queries.markdown: invalid byte sequence in US-ASCII

看起來貌似是預設編碼的問題,ZSH使用的預設編碼是US-ASCII,但我期望的是UTF-8。

ok,檢視當前zsh shell下的編碼是什麼。

1
2
3
4
5
6
7
8
9
$ locale
LANG=
LC_COLLATE="C"
LC_CTYPE="C"
LC_MESSAGES="C"
LC_MONETARY="C"
LC_NUMERIC="C"
LC_TIME="C"
LC_ALL=

由於沒設值,所以ZSH就選取了US-ASCII。

解決辦法也很簡單,在~/.zshrc中加入以下兩行。

~/.zshrc
1
2
3
4
5
6
7
8
9
export LC_ALL=en_US.UTF-8  export LANG=en_US.UTF-8```然後重新載入zshrc檔案並檢視編碼。$ source ~/.zshrc$ locale
# Compilation flagsLANG="en_US.UTF-8"
LC_COLLATE="en_US.UTF-8"
LC_CTYPE="en_US.UTF-8"
LC_MESSAGES="en_US.UTF-8"
LC_MONETARY="en_US.UTF-8"
LC_NUMERIC="en_US.UTF-8"
LC_TIME="en_US.UTF-8"
LC_ALL="en_US.UTF-8”

萬用字元問題

我又發現如果命令列中有[] *等字元會被zsh優先作為萬用字元處理,這樣導致某些命令會被ZSH錯誤解析。

比如:

1
$ rake new_post[‘a new post’]

這裡的[]是ruby語言中的語法,但是被ZSH解析成了萬用字元,所以報錯。解決方法也簡單,關閉ZSH的這一特性。

在~/.zshrc中加入下面一行即可搞定。

1
setopt no_nomatch

相關文章