Zsh 入門

從 Bash 進階到 Z-shell,改進你的 shell 體驗。linux

Z-shell(Zsh)是一種 Bourne 式的交互式 POSIX shell,以其豐富的創新功能而著稱。Z-Shell 用戶常常會說起它的許多便利之處,讚譽它對效率的提升和豐富的自定義支持。git

若是你剛接觸 Linux 或 Unix,但你的經驗足以讓你能夠打開終端並運行一些命令的話,那麼你可能使用的就是 Bash shell。Bash 多是最具備表明意義的自由軟件 shell,部分是由於它具備的先進的功能,部分是由於它是大多數流行的 Linux 和 Unix 操做系統上的默認 shell。可是,隨着使用的次數越多,你可能會開始發現一些細節可能可以作的更好。開源有一個衆所周知的地方,那就是選擇。因此,許多人選擇從 Bash 「畢業」到 Z。github

Zsh 介紹

Shell 只是操做系統的接口。交互式 shell 程序容許你經過稱爲標準輸入(stdin)的某個東西鍵入命令,並經過標準輸出(stdout)和標準錯誤(stderr)獲取輸出。有不少種 shell,如 Bash、Csh、Ksh、Tcsh、Dash 和 Zsh。每一個都有其開發者所認爲最適合於 Shell 的功能。而這些功能的好壞,則取決於最終用戶。正則表達式

Zsh 具備交互式製表符補全、自動文件搜索、支持正則表達式、用於定義命令範圍的高級速記符,以及豐富的主題引擎等功能。這些功能也包含在你所熟悉的其它 Bourne 式 shell 環境中,這意味着,若是你已經瞭解並喜歡 Bash,那麼你也會熟悉 Zsh,除此之外,它還有更多的功能。你可能會認爲它是一種 Bash++。shell

安裝 Zsh

用你的包管理器安裝 Zsh。ubuntu

在 Fedora、RHEL 和 CentOS 上:windows

$ sudo dnf install zsh
複製代碼

在 Ubuntu 和 Debian 上:bash

$ sudo apt install zsh
複製代碼

在 MacOS 上你可使用 MacPorts 安裝它:服務器

$ sudo port install zsh
複製代碼

或使用 Homebrew:app

$ brew install zsh
複製代碼

在 Windows 上也能夠運行 Zsh,可是隻能在 Linux 層或相似 Linux 的層之上運行,例如 Windows 的 Linux 子系統(WSL)或 Cygwin。這類安裝超出了本文的範圍,所以請參考微軟的文檔。

設置 Zsh

Zsh 不是終端模擬器。它是在終端仿真器中運行的 shell。所以,要啓動 Zsh,必須首先啓動一個終端窗口,例如 GNOME Terminal、Konsole、Terminal、iTerm二、rxvt 或你喜歡的其它終端。而後,你能夠經過鍵入如下命令啓動 Zsh:

$ zsh
複製代碼

首次啓動 Zsh 時,會要求你選擇一些配置選項。這些均可以在之後更改,所以請按 1 繼續。

This is the Z Shell configuration function for new users, zsh-newuser-install.

(q)  Quit and do nothing.

(0)  Exit, creating the file ~/.zshrc

(1)  Continue to the main menu.
複製代碼

偏好設置分爲四類,所以請從頂部開始。

  1. 第一個類使你能夠選擇在 shell 歷史記錄文件中保留多少個命令。默認狀況下,它設置爲 1,000 行。
  2. Zsh 補全是其最使人興奮的功能之一。爲了簡單起見,請考慮使用其默認選項激活它,直到你習慣了它的工做方式。按 1 使用默認選項,按 2 手動設置選項。
  3. 選擇 Emacs 式鍵綁定或 Vi 式鍵綁定。Bash 使用 Emacs 式綁定,所以你可能已經習慣了。
  4. 最後,你能夠了解(以及設置或取消設置)Zsh 的一些精妙的功能。例如,當你提供不帶命令的非可執行路徑時,能夠經過讓 Zsh 來改變目錄而無需你使用 cd 命令。要激活這些額外選項之一,請輸入選項號並輸入 s 進行設置。請嘗試打開全部選項以得到完整的 Zsh 體驗。你能夠稍後經過編輯 ~/.zshrc 取消設置它們。

要完成配置,請按 0

使用 Zsh

剛開始,Zsh 的使用感覺就像使用 Bash 同樣,這無疑是其衆多功能之一。例如,Bash 和 Tcsh 之間就存在嚴重的差別,所以若是你必須在工做中或在服務器上使用 Bash,而 Zsh 就能夠在家裏輕鬆嘗試和使用,這樣在 Bash 和 Zsh 之間輕鬆切換就是一種便利。

在 Zsh 中改變目錄

正是這些微小的差別使 Zsh 變得好用。首先,嘗試在沒有 cd 命令的狀況下,將目錄更改成 Documents 文件夾。簡直太棒了,難以置信。若是你輸入的是目錄路徑而沒有進一步的指令,Zsh 會更改成該目錄:

% Documents
% pwd
/home/seth/Documents
複製代碼

而這會在 Bash 或任何其餘普通 shell 中致使錯誤。可是 Zsh 卻根本不是普通的 shell,而這僅僅纔是開始。

在 Zsh 中搜索

當你想使用普通 shell 程序查找文件時,可使用 findlocate 命令。最起碼,你可使用 ls -R 來遞歸地列出一組目錄。Zsh 內置有容許它在當前目錄或任何其餘子目錄中查找文件的功能。

例如,假設你有兩個名爲 foo.txt 的文件。一個位於你的當前目錄中,另外一個位於名爲 foo 的子目錄中。在 Bash Shell 中,你可使用如下命令列出當前目錄中的文件:

$ ls
foo.txt
複製代碼

你能夠經過明確指明子目錄的路徑來列出另外一個目錄:

$ ls foo
foo.txt
複製代碼

要同時列出這二者,你必須使用 -R 開關,並結合使用 grep

$ ls -R | grep foo.txt
foo.txt
foo.txt
複製代碼

可是在 Zsh 中,你可使用 ** 速記符號:

% ls **/foo.txt
foo.txt
foo.txt
複製代碼

你能夠在任何命令中使用此語法,而不只限於 ls。想象一下在這樣的場景中提升的效率:將特定文件類型從一組目錄中移動到單個位置、將文本片斷串聯到一個文件中,或對日誌進行抽取。

使用 Zsh 的製表符補全

製表符補全是 Bash 和其餘一些 Shell 中的高級用戶功能,它變得司空見慣,席捲了 Unix 世界。Unix 用戶再也不須要在輸入冗長而乏味的路徑時使用通配符(例如輸入 /h*/s*h/V*/SCS/sc*/comp*/t*/a*/*9/04/LS*boat*v,比輸入 /home/seth/Videos/SCS/scenes/composite/takes/approved/109/04/LS_boat-port-cargo-mover.mkv 要容易得多)。相反,他們只要輸入足夠的惟一字符串便可按 Tab 鍵。例如,若是你知道在系統的根目錄下只有一個以 h 開頭的目錄,則能夠鍵入 /h,而後單擊 Tab。快速、簡單、高效。它還會確認路徑存在;若是 Tab 沒法完成任何操做,則說明你在錯誤的位置或輸入了錯誤的路徑部分。

可是,若是你有許多目錄有五個或更多相同的首字母,Tab 會堅定拒絕進行補全。儘管在大多數現代終端中,它將(至少會)顯示阻止其進行猜想你的意思的文件,但一般須要按兩次 Tab 鍵才能顯示它們。所以,製表符補全一般會變成來回按下鍵盤上字母和製表符,以致於你好像在接受鋼琴獨奏會的訓練。

Zsh 經過循環可能的補全來解決這個小問題。若是鍵入 *ls ~/D 並按 Tab,則 Zsh 首先使用 Documents 來完成命令;若是再次按 Tab,它將提供 Downloads,依此類推,直到找到所需的選項。

Zsh 中的通配符

在 Zsh 中,通配符的行爲不一樣於 Bash 中用戶所習慣的行爲。首先,能夠對其進行修改。例如,若是要列出當前目錄中的全部文件夾,則可使用修改後的通配符:

% ls
dir0   dir1   dir2   file0   file1
% ls *(/)
dir0   dir1   dir2
複製代碼

在此示例中,(/) 限定了通配符的結果,所以 Zsh 僅顯示目錄。要僅列出文件,請使用 (.)。要列出符號連接,請使用 (@)。要列出可執行文件,請使用 (*)

% ls ~/bin/*(*)
fop  exify  tt
複製代碼

Zsh 不只僅知道文件類型。它也可使用相同的通配符修飾符約定根據修改時間列出。例如,若是要查找在過去八個小時內修改的文件,請使用 mh 修飾符(即 「modified hours」 的縮寫)和小時的負整數:

% ls ~/Documents/*(mh-8)
cal.org   game.org   home.org
複製代碼

要查找超過(例如)兩天前修改過的文件,修飾符更改成 md(即 「modified day」 的縮寫),並帶上天數的正整數:

% ls ~/Documents/*(+2)
holiday.org
複製代碼

通配符修飾符和限定符還能夠作不少事情,所以,請閱讀 Zsh 手冊頁,以獲取所有詳細信息。

通配符的反作用

要像在 Bash 中使用通配符同樣使用它,有時必須在 Zsh 中對通配符進行轉義。例如,若是要在 Bash 中將某些文件複製到服務器上,則可使用以下通配符:

$ scp IMG_*.JPG seth@example.com:~/www/ph*/*19/09/14
複製代碼

這在 Bash 中有效,可是在 Zsh 中會返回錯誤,由於它在發出 scp 命令以前嘗試在遠程端擴展該變量(通配符)。爲避免這種狀況,必須轉義遠程變量(通配符):

% scp IMG_*.JPG seth@example.com:~/www/ph\*/\*19/09/14
複製代碼

當你切換到新的 shell 時,這些小異常可能會使你感到沮喪。使用 Zsh 時會遇到的問題很少(體驗過 Zsh 後切換回 Bash 的可能遇到更多),可是當它們發生時,請保持鎮定且坦率。嚴格遵照 POSIX 的狀況不多會出錯,可是若是失敗了,請查找問題以解決並繼續。對於許多在工做中困在一個 shell 上而在家中困在另外一個 shell 上的用戶來講,hyperpolyglot.org 已被證實其是無價的。

在個人下一篇 Zsh 文章中,我將向你展現如何安裝主題和插件以定製你的 Z-Shell 甚至 Z-ier。


via: opensource.com/article/19/…

做者:Seth Kenlon 選題:lujun9972 譯者:wxy 校對:wxy

本文由 LCTT 原創編譯,Linux中國 榮譽推出

相關文章
相關標籤/搜索