Linux終極shell-Z Shell——用強大的zsh&oh-my-zsh把Bash換掉

大多數的Linux用戶偏愛Bash,因為發行版通常默認的就是它。

Bash確實是不錯的Shell,但仍有用很多不盡人意的地方,如自動補全的功能不夠強大,定位較長路徑不夠方便,命令歷史管理不夠完善等。

介紹使用zsh,功能十分強大..推薦給大家!

1、zsh介紹

1.1 Linux shell

Linux/Unix提供了很多種Shell,為毛要這麼多Shell?

難道用來炒著吃麼?那我問你,你同類型的衣服怎麼有那麼多件?花色,質地還不一樣。寫程序比買衣服複雜多了,而且程序員往往負責把複雜的事情搞簡單,簡單的事情搞複雜。牛程序員看到不爽的Shell,就會自己重新寫一套,慢慢形成了一些標準,常用的Shell有這麼幾種,sh、bash、csh等,想知道你的系統有幾種shell,可以通過以下命令查看:

cat /etc/shells

顯示如下:

Linux終極shell-Z Shell——用強大的zsh&oh-my-zsh把Bash換掉

1.2 zsh簡介

Zsh是一個Linux下強大的shell, 由於大多數Linux產品安裝,以及默認使用bash shell, 但是絲毫不影響極客們對zsh的熱衷, 幾乎每一款Linux產品都包含有zsh,通常可以用apt-get、urpmi或yum等包管理器進行安裝

Zsh具有以下主要功能

  • 開箱即用、可編程的命令行補全功能可以幫助用戶輸入各種參數以及選項
  • 在用戶啟動的所有shell中共享命令歷史
  • 通過擴展的文件通配符,可以不利用外部命令達到find命令一般展開文件名
  • 改進的變量與數組處理
  • 在緩衝區中編輯多行命令
  • 多種兼容模式,例如使用/bin/sh運行時可以偽裝成Bourne shell
  • 可以定製呈現形式的提示符;包括在屏幕右端顯示信息,並在鍵入長命令時自動隱藏
  • 可加載的模塊,提供其他各種支持:完整的TCP與Unix域套接字控制,FTP客戶端與擴充過的數學函數
  • 完全可定製化

1.3 zsh與oh-my-zsh終極配置

不熟悉 Zsh 的人,對 Zsh 最深刻的印象應該就是它的命令提示符了。它支持右側對齊的提示符,並且可以配置成這個樣子的:

Linux終極shell-Z Shell——用強大的zsh&oh-my-zsh把Bash換掉

zsh 的自動補全功能十分的強大,如圖所示:

Linux終極shell-Z Shell——用強大的zsh&oh-my-zsh把Bash換掉

它可以自動補全命令、參數、文件名、進程、用戶名、變量、權限符等。

Zsh 還有一個貼心的功能:路徑別名。假設有一個很長的路徑,例如 /home/lighttpd/html,可以把這個路徑命名為 ~WWW。

Linux終極shell-Z Shell——用強大的zsh&oh-my-zsh把Bash換掉

Zsh 可以使用 Emacs 風格的鍵綁定,習慣 Bash 鍵綁定的朋友無需重新適應。Zsh 兼容大多數主流 Shell,像 Bash、Csh 等。

錯誤校正

Linux終極shell-Z Shell——用強大的zsh&oh-my-zsh把Bash換掉

-- directory -- 是補全類型提示

/etc/x11 [tab] 後被修正為 /etc/X11

Linux終極shell-Z Shell——用強大的zsh&oh-my-zsh把Bash換掉

全類型提示變成了 -- corrections --

請注意,這個功能不是單純的修正大小寫,而是各種拼寫錯誤 比如說上面的例子,如果輸入的是 11 或者 s11,它一樣會修正為 X11

有一個前提,就是每次修正,只允許有一處字符錯誤 兩個以上的錯誤,除非可以匹配其它的選項,否則就不能修正 12 就不能修正為 X11 ,除非候選裡有 X12、Y12、Z12……

在配置文件裡找到這一行,修改容錯字數

<code>zstyle ':completion:*:approximate:*' max-errors 1 numeric
/<code>

當然可以把容錯字數改大一些,不過太大了也沒有意義了 隨便輸點什麼,就可以匹配所有的,和沒有一樣

強大的重定向功能

同時重定向 stdout 和 stderr 到 file: command |& >file 同時重定向到多個文件: command >file.1 >file.2

比如裝系統的時候,可以用這個命令

<code>blkid >> /boot/grub/menu.lst >> /etc/fstab
/<code>

補全類型控制

例如:

<code>compctl -g '*.tar.gz *.gz*.tgz' + -g '*(-/)' tar zxvf
/<code>

過濾候選項

tar zxvf [tab] 候選菜單中只出現擴展名為 .tar.gz .gz .tgz 的文件

不過這個功能比較複雜,容易引起混亂,通常需要腳本配合

<code>compctl -g '*.tar.bz2 *.tar.gz *.bz2 *.gz *.jar *.rar *.tar *.tbz2 *.tgz *.zip *.Z' + -g '*(-/)' extractextract() {  
   if [[ -z "$1" ]] ; then
       print -P "usage: \\\\e[1;36mextract\\\\e[1;0m < filename >"
       print -P "       Extract the file specified based on the extension"
   elif [[ -f $1 ]] ; then
       case ${(L)1} in
           *.tar.bz2)  tar -jxvf $1    ;;
           *.tar.gz)   tar -zxvf $1    ;;
           *.bz2)      bunzip2 $1       ;;
           *.gz)       gunzip $1       ;;
           *.jar)      unzip $1       ;;
           *.rar)      unrar x $1       ;;
           *.tar)      tar -xvf $1       ;;
           *.tbz2)     tar -jxvf $1    ;;
           *.tgz)      tar -zxvf $1    ;;
           *.zip)      unzip $1          ;;
           *.Z)        uncompress $1    ;;
           *)          echo "Unable to extract '$1' :: Unknown extension"
       esac
   else
       echo "File ('$1') does not exist!"
   fi
}
/<code>

考慮到使用的不多,配置又麻煩,我沒有配置這個功能,不過我想肯定有人願意在這上面花點時間

將 Zsh 設置為默認 Shell(不建議更改 root 用戶的默認 shell)

<code>usermod -s /usr/local/bin/zsh/<code>

2、安裝zsh

2.1 安裝zsh

對於一般的Ubuntu系統,配置好正確的源之後,就能直接鍵入以下命令安裝:

<code>sudo apt-get install zsh/<code>

2.2 取代bash,設為默認shell

<code>sudo usermod -s /bin/zsh username/<code>

或者

<code>chsh -s /bin/zsh
chsh -s `which zsh`/<code>

如果要切換回去bash:

<code>chsh -s /bin/bash/<code>

當然你實在不願意把zsh當成默認的shell, 而又想使用它, 那麼你可以每次進入是都使用zsh進入, 而輸入exit退出

Linux終極shell-Z Shell——用強大的zsh&oh-my-zsh把Bash換掉

2.3 安裝oh-my-zsh

直接用zsh會很蛋疼,因為zsh功能很強大但是太複雜,所以需要oh-my-zsh來將它簡單化

直接用git從github上面下載包

<code>git clone git://github.com/robbyrussell/oh-my-zsh.git ~/.oh-my-zsh/<code>

備份已有的zshrc, 替換zshrc

<code>cp ~/.zshrc ~/.zshrc.origcp ~/.oh-my-zsh/templates/zshrc.zsh-template ~/.zshrc/<code>

直接使用腳本安裝

<code>cd oh-my-zsh/tools
./install.sh/<code>

你可以直接直接使用如下命令安裝

curl

<code>sh -c "$(curl -fsSL https://raw.githubusercontent.com/robbyrussell/oh-my-zsh/master/tools/install.sh)"/<code>

wget

<code>sh -c "$(wget https://raw.githubusercontent.com/robbyrussell/oh-my-zsh/master/tools/install.sh -O -)"/<code>

其本質就是下載並執行了github上的install.sh腳本, 該腳本位於oh-my-zsh/tools/install.sh

配置主題

oh-my-zsh集成了大量的主題, 位於oh-my-zsh/theme

配置主題, 可以通過修改~/.zshrc中的環境變量ZSH_THEME來完成

<code>ZSH_THEME="agnoster" # (this is one of the fancy ones)/<code>

如果你覺得主題太多你可以選擇使用隨機模式, 來由系統隨機選擇

<code>ZSH_THEME="random" # (...please let it be pie... please be some pie..)/<code>
Linux終極shell-Z Shell——用強大的zsh&oh-my-zsh把Bash換掉

配置插件

修改~/.zshrc中plugins

<code>plugins=(git bundler osx rake ruby)/<code>

更新oh-my-zsh

默認情況下, 您將被提示檢查每幾周的升級. 如果你想我ZSH自動升級本身沒有提示你, 修改`~/.zshrc

<code>disable_update_prompt = true/<code>

禁用自動升級, 修改~/.zshrc

<code>disable_auto_update = true/<code>

當然你也可以選擇手動更新

如果你想在任何時間點升級(也許有人剛剛發佈了一個新的插件,你不想等待一個星期?)你只需要運行:

<code>upgrade_oh_my_zsh/<code>

卸載oh-my-zsh

如果你想卸載oh-my-zsh, 只需要執行uninstall_oh_my_zsh zsh, 從命令行運行. 這將刪除本身和恢復你以前的bash或者zsh配置.

<code>uninstall_oh_my_zsh zsh/<code>

此外, 更多任性的功能, 速度來感受吧

  1. 兼容 bash,原來使用 bash 的兄弟切換過來毫無壓力,該咋用咋用。
  2. 強大的歷史紀錄功能,輸入 grep 然後用上下箭頭可以翻閱你執行的所有 grep 命令。
  3. 智能拼寫糾正,輸入gtep mactalk * -R,系統會提示:zsh: correct ‘gtep’ to ‘grep’ [nyae]? 比妹紙貼心吧,她們向來都是讓你猜的……
  4. 各種補全:路徑補全、命令補全,命令參數補全,插件內容補全等等。觸發補全只需要按一下或兩下 tab 鍵,補全項可以使用 ctrl+n/p/f/b上下左右切換。比如你想殺掉 java 的進程,只需要輸入 kill java + tab鍵,如果只有一個 java 進程,zsh 會自動替換為進程的 pid,如果有多個則會出現選擇項供你選擇。ssh + 空格 + 兩個tab鍵,zsh會列出所有訪問過的主機和用戶名進行補全
  5. 智能跳轉,安裝了autojump之後,zsh 會自動記錄你訪問過的目錄,通過 j + 目錄名 可以直接進行目錄跳轉,而且目錄名支持模糊匹配和自動補全,例如你訪問過hadoop-1.0.0目錄,輸入j hado 即可正確跳轉。j –stat 可以看你的歷史路徑庫。
  6. 目錄瀏覽和跳轉:輸入 d,即可列出你在這個會話裡訪問的目錄列表,輸入列表前的序號,即可直接跳轉。
  7. 在當前目錄下輸入 .. 或 … ,或直接輸入當前目錄名都可以跳轉,你甚至不再需要輸入 cd 命令了。
  8. 通配符搜索:ls -l */.sh,可以遞歸顯示當前目錄下的 shell 文件,文件少時可以代替 find,文件太多就歇菜了。
  9. 更強的別名
  10. 插件支持

需要C/C++ Linux服務器架構師學習資料私信“資料”(資料包括C/C++,Linux,golang技術,Nginx,ZeroMQ,MySQL,Redis,fastdfs,MongoDB,ZK,流媒體,CDN,P2P,K8S,Docker,TCP/IP,協程,DPDK,ffmpeg等),免費分享


分享到:


相關文章: